Lines 82-87
Link Here
|
82 |
import org.apache.jmeter.util.BeanShellServer; |
82 |
import org.apache.jmeter.util.BeanShellServer; |
83 |
import org.apache.jmeter.util.JMeterUtils; |
83 |
import org.apache.jmeter.util.JMeterUtils; |
84 |
import org.apache.jorphan.collections.HashTree; |
84 |
import org.apache.jorphan.collections.HashTree; |
|
|
85 |
import org.apache.jorphan.collections.HashTreeTraverser; |
85 |
import org.apache.jorphan.collections.SearchByClass; |
86 |
import org.apache.jorphan.collections.SearchByClass; |
86 |
import org.apache.jorphan.gui.ComponentUtil; |
87 |
import org.apache.jorphan.gui.ComponentUtil; |
87 |
import org.apache.jorphan.logging.LoggingManager; |
88 |
import org.apache.jorphan.logging.LoggingManager; |
Lines 859-864
Link Here
|
859 |
if (subTree != null) { |
860 |
if (subTree != null) { |
860 |
HashTree replacementTree = rc.getReplacementSubTree(); |
861 |
HashTree replacementTree = rc.getReplacementSubTree(); |
861 |
if (replacementTree != null) { |
862 |
if (replacementTree != null) { |
|
|
863 |
checkForInfiniteRecursivity(replacementTree, rc); |
862 |
convertSubTree(replacementTree); |
864 |
convertSubTree(replacementTree); |
863 |
tree.replace(item, rc); |
865 |
tree.replace(item, rc); |
864 |
tree.set(rc, replacementTree); |
866 |
tree.set(rc, replacementTree); |
Lines 884-889
Link Here
|
884 |
if (subTree != null) { |
886 |
if (subTree != null) { |
885 |
HashTree replacementTree = rc.getReplacementSubTree(); |
887 |
HashTree replacementTree = rc.getReplacementSubTree(); |
886 |
if (replacementTree != null) { |
888 |
if (replacementTree != null) { |
|
|
889 |
checkForInfiniteRecursivity(replacementTree, rc); |
887 |
convertSubTree(replacementTree); |
890 |
convertSubTree(replacementTree); |
888 |
tree.replace(item, rc); |
891 |
tree.replace(item, rc); |
889 |
tree.set(rc, replacementTree); |
892 |
tree.set(rc, replacementTree); |
Lines 900-905
Link Here
|
900 |
} |
903 |
} |
901 |
} |
904 |
} |
902 |
} |
905 |
} |
|
|
906 |
|
907 |
/** |
908 |
* @since 2.10.1 |
909 |
*/ |
910 |
private static final class InfiniteRecursivityDetector implements HashTreeTraverser { |
911 |
boolean infiniteRecursivity; |
912 |
private ReplaceableController replaceableController; |
913 |
|
914 |
/** |
915 |
* |
916 |
* @param nodeToFind |
917 |
*/ |
918 |
public InfiniteRecursivityDetector(ReplaceableController replaceableController) { |
919 |
this.replaceableController = replaceableController; |
920 |
} |
921 |
|
922 |
/** |
923 |
* @return boolean |
924 |
*/ |
925 |
public boolean getInfiniteRecursivity() { |
926 |
return infiniteRecursivity; |
927 |
} |
928 |
|
929 |
@Override |
930 |
public void subtractNode() { |
931 |
// noop |
932 |
} |
933 |
|
934 |
@Override |
935 |
public void processPath() { |
936 |
// noop |
937 |
} |
938 |
|
939 |
@Override |
940 |
public void addNode(Object node, HashTree subTree) { |
941 |
if(infiniteRecursivity== true) { |
942 |
return; |
943 |
} |
944 |
if(node instanceof JMeterTreeNode) { |
945 |
Object uo = ((JMeterTreeNode)node).getUserObject(); |
946 |
if(uo==replaceableController) { |
947 |
this.infiniteRecursivity = true; |
948 |
} |
949 |
} |
950 |
if(node == replaceableController) { |
951 |
this.infiniteRecursivity = true; |
952 |
} |
953 |
} |
954 |
} |
955 |
|
956 |
/** |
957 |
* Checks that replacementTree (built after replacement of ReplaceableController) does |
958 |
* not still contain ReplaceableController which would lead to infinite recursivity |
959 |
* see BUG 55375 |
960 |
* @param replacementTree {@link HashTreeTraverser} |
961 |
* @param replaceableController {@link ReplaceableController} |
962 |
*/ |
963 |
private static void checkForInfiniteRecursivity(HashTree replacementTree, |
964 |
final ReplaceableController replaceableController) { |
965 |
InfiniteRecursivityDetector hashTreeTraverser = new InfiniteRecursivityDetector(replaceableController); |
966 |
replacementTree.traverse(hashTreeTraverser); |
967 |
if(hashTreeTraverser.getInfiniteRecursivity()) { |
968 |
throw new IllegalStateException( |
969 |
"Recursivity detected in tree:"+((TestElement)replaceableController).getName()); |
970 |
} |
971 |
} |
903 |
|
972 |
|
904 |
/** |
973 |
/** |
905 |
* Ensures the {@link ReplaceableController} is loaded |
974 |
* Ensures the {@link ReplaceableController} is loaded |