From 540a529dee7ca34ed7dd00bd5da9aa8cfcb57fe6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 8 Jan 2014 21:34:17 -0500 Subject: [PATCH] Fixing Actionable.replaceAction. --- .../main/java/hudson/model/Actionable.java | 11 +++-- .../java/hudson/model/ActionableTest.java | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 core/src/test/java/hudson/model/ActionableTest.java diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index 4b492dee97..5b91cad0ce 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -129,12 +129,15 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * @since 1.548 */ public void replaceAction(Action a) { - Iterator it = getActions().iterator(); - while (it.hasNext()) { - if (a.getClass() == it.next().getClass()) { - it.remove(); + // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: + List old = new ArrayList(1); + List current = getActions(); + for (Action a2 : current) { + if (a2.getClass() == a.getClass()) { + old.add(a2); } } + current.removeAll(old); addAction(a); } diff --git a/core/src/test/java/hudson/model/ActionableTest.java b/core/src/test/java/hudson/model/ActionableTest.java new file mode 100644 index 0000000000..4f45405080 --- /dev/null +++ b/core/src/test/java/hudson/model/ActionableTest.java @@ -0,0 +1,48 @@ +/* + * The MIT License + * + * Copyright 2014 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package hudson.model; + +import java.util.Arrays; +import static org.junit.Assert.*; +import org.junit.Test; + +public class ActionableTest { + + @SuppressWarnings("deprecation") + @Test public void replaceAction() { + Actionable thing = new Actionable() { + @Override public String getDisplayName() {return null;} + @Override public String getSearchUrl() {return null;} + }; + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + thing.addAction(a1); + thing.addAction(a2); + CauseAction a3 = new CauseAction(); + thing.replaceAction(a3); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + } + +}