From 76c9d38f576c9a2b92a66d948a71c22053458757 Mon Sep 17 00:00:00 2001 From: Antonio Alonzi Date: Sat, 28 Mar 2020 19:56:25 +0000 Subject: [PATCH] #6256: Fixed Watcher copy method for JDK11 --- Mage/src/main/java/mage/watchers/Watcher.java | 9 ++- Mage/src/test/java/mage/WatcherTest.java | 69 +++++++++++++++++++ 2 files changed, 73 insertions(+), 5 deletions(-) diff --git a/Mage/src/main/java/mage/watchers/Watcher.java b/Mage/src/main/java/mage/watchers/Watcher.java index 97ebc27bc06..a3f050aa0d5 100644 --- a/Mage/src/main/java/mage/watchers/Watcher.java +++ b/Mage/src/main/java/mage/watchers/Watcher.java @@ -5,7 +5,6 @@ import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; import org.apache.log4j.Logger; -import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; import java.io.Serializable; import java.lang.reflect.*; @@ -113,16 +112,16 @@ public abstract class Watcher implements Serializable { field.setAccessible(true); if (field.getType() == Set.class) { - ((Set) field.get(watcher)).clear(); + field.set(watcher, new HashSet<>()); ((Set) field.get(watcher)).addAll((Set) field.get(this)); } else if (field.getType() == Map.class) { - Map target = ((Map) field.get(watcher)); - target.clear(); + HashMap target = new HashMap<>(); + field.set(watcher, target); Map source = (Map) field.get(this); ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); Type valueType = parameterizedType.getActualTypeArguments()[1]; - if (valueType instanceof ParameterizedTypeImpl && ((ParameterizedTypeImpl) valueType).getRawType().getSimpleName().contains("Set")) { + if (valueType.getClass().getSimpleName().contains("Set")) { source.entrySet().forEach(kv -> { Object key = ((Map.Entry) kv).getKey(); Set value = (Set) ((Map.Entry) kv).getValue(); diff --git a/Mage/src/test/java/mage/WatcherTest.java b/Mage/src/test/java/mage/WatcherTest.java index 8b8c44b160e..45e50a84e34 100644 --- a/Mage/src/test/java/mage/WatcherTest.java +++ b/Mage/src/test/java/mage/WatcherTest.java @@ -1,4 +1,73 @@ package mage; +import static mage.constants.WatcherScope.GAME; +import static org.junit.Assert.assertEquals; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import java.util.Map; +import java.util.Set; +import mage.constants.WatcherScope; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.watchers.Watcher; +import org.junit.Test; + public class WatcherTest { + + @Test + public void test() { + // Given + TestWatcher testWatcher = new TestWatcher(GAME); + testWatcher.setStringField("stringField"); + testWatcher.setSetField(ImmutableSet.of("setField1, setField2")); + testWatcher.setMapField(ImmutableMap.of("mapFieldKey1, mapFieldValue1", "mapFieldKey2, mapFieldValue2")); + + // When + TestWatcher copy = testWatcher.copy(); + + // Then + assertEquals(testWatcher.getStringField(), copy.getStringField()); + assertEquals(testWatcher.getSetField(), copy.getSetField()); + assertEquals(testWatcher.getMapField(), copy.getMapField()); + } + + public static class TestWatcher extends Watcher { + private String stringField; + private Set setField; + private Map mapField; + + public TestWatcher(WatcherScope scope) { + super(scope); + } + + @Override + public void watch(GameEvent event, Game game) { + System.out.println("watch"); + } + + public String getStringField() { + return stringField; + } + + public void setStringField(String stringField) { + this.stringField = stringField; + } + + public Set getSetField() { + return setField; + } + + public void setSetField(Set setField) { + this.setField = setField; + } + + public Map getMapField() { + return mapField; + } + + public void setMapField(Map mapField) { + this.mapField = mapField; + } + } }