Hi Julia, The fix has been updated accordingly. Please review it. Thanks for your time.
*BUG DESCRIPTION*: JDK-8245694 <https://bugs.openjdk.java.net/browse/JDK-8245694>: java.util.Properties.entrySet() does not override java.lang.Object methods since java 9. *PROPOSED FIX*: Add delegating overrides for equals(), hashCode(), and toString(). *PATCH*: # HG changeset patch # User yuli # Date 1592663277 -28800 # Sat Jun 20 22:27:57 2020 +0800 # Node ID 09736e9e4c386691331d1c9cbdf4b4b606d44d8d # Parent 216c6baa0564a1889e8e7b717f476eae7442ef27 8245694: java.util.Properties.entrySet() does not override Object methods Summary: Add missing override methods Contributed-by: Yu Li <liyu.it...@gmail.com> diff -r 216c6baa0564 -r 09736e9e4c38 src/java.base/share/classes/java/util/Properties.java --- a/src/java.base/share/classes/java/util/Properties.java Sat Jun 20 15:11:19 2020 +0800 +++ b/src/java.base/share/classes/java/util/Properties.java Sat Jun 20 22:27:57 2020 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1405,6 +1405,21 @@ } @Override + public boolean equals(Object o) { + return o == this || entrySet.equals(o); + } + + @Override + public int hashCode() { + return entrySet.hashCode(); + } + + @Override + public String toString() { + return entrySet.toString(); + } + + @Override public boolean removeAll(Collection<?> c) { return entrySet.removeAll(c); } diff -r 216c6baa0564 -r 09736e9e4c38 test/jdk/java/util/Properties/PropertiesEntrySetTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/java/util/Properties/PropertiesEntrySetTest.java Sat Jun 20 22:27:57 2020 +0800 @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8245694 + * @summary tests the entrySet() method of Properties class + * @author Yu Li + * @run testng PropertiesEntrySetTest + */ + +import org.testng.annotations.Test; + +import java.util.Properties; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertThrows; +import static org.testng.Assert.assertTrue; + +public class PropertiesEntrySetTest { + + @Test + public void testEquals() { + Properties a = new Properties(); + var aEntrySet = a.entrySet(); + assertFalse(aEntrySet.equals(null)); + assertTrue(aEntrySet.equals(aEntrySet)); + + Properties b = new Properties(); + var bEntrySet = b.entrySet(); + assertTrue(bEntrySet.equals(aEntrySet)); + assertTrue(bEntrySet.hashCode() == aEntrySet.hashCode()); + + a.setProperty("p1", "1"); + assertFalse(bEntrySet.equals(aEntrySet)); + assertFalse(bEntrySet.hashCode() == aEntrySet.hashCode()); + + b.setProperty("p1", "1"); + assertTrue(aEntrySet.equals(bEntrySet)); + assertTrue(bEntrySet.hashCode() == aEntrySet.hashCode()); + + Properties c = new Properties(); + c.setProperty("p1", "2"); + var cEntrySet = c.entrySet(); + assertFalse(cEntrySet.equals(bEntrySet)); + assertFalse(bEntrySet.hashCode() == cEntrySet.hashCode()); + assertFalse(cEntrySet.equals(aEntrySet)); + assertFalse(aEntrySet.hashCode() == cEntrySet.hashCode()); + + a.setProperty("p2", "2"); + Properties d = new Properties(); + d.setProperty("p2", "2"); + d.setProperty("p1", "1"); + var dEntrySet = d.entrySet(); + assertTrue(dEntrySet.equals(aEntrySet)); + assertTrue(aEntrySet.hashCode() == dEntrySet.hashCode()); + + a.remove("p1"); + assertFalse(aEntrySet.equals(dEntrySet)); + assertFalse(aEntrySet.hashCode() == dEntrySet.hashCode()); + + d.remove("p1", "1"); + assertTrue(dEntrySet.equals(aEntrySet)); + assertTrue(aEntrySet.hashCode() == dEntrySet.hashCode()); + + a.clear(); + assertFalse(aEntrySet.equals(dEntrySet)); + assertFalse(aEntrySet.hashCode() == dEntrySet.hashCode()); + assertTrue(aEntrySet.isEmpty()); + + d.clear(); + assertTrue(dEntrySet.equals(aEntrySet)); + assertTrue(aEntrySet.hashCode() == dEntrySet.hashCode()); + assertTrue(dEntrySet.isEmpty()); + } + + @Test + public void testToString() { + Properties a = new Properties(); + var aEntrySet = a.entrySet(); + assertEquals(aEntrySet.toString(), "[]"); + + a.setProperty("p1", "1"); + assertEquals(aEntrySet.toString(), "[p1=1]"); + + a.setProperty("p2", "2"); + assertEquals(aEntrySet.size(), 2); + assertTrue(aEntrySet.toString().trim().startsWith("[")); + assertTrue(aEntrySet.toString().contains("p1=1")); + assertTrue(aEntrySet.toString().contains("p2=2")); + assertTrue(aEntrySet.toString().trim().endsWith("]")); + + Properties b = new Properties(); + b.setProperty("p2", "2"); + b.setProperty("p1", "1"); + var bEntrySet = b.entrySet(); + assertEquals(bEntrySet.size(), 2); + assertTrue(bEntrySet.toString().trim().startsWith("[")); + assertTrue(bEntrySet.toString().contains("p1=1")); + assertTrue(bEntrySet.toString().contains("p2=2")); + assertTrue(bEntrySet.toString().trim().endsWith("]")); + + b.setProperty("p0", "0"); + assertEquals(bEntrySet.size(), 3); + assertTrue(bEntrySet.toString().contains("p0=0")); + + b.remove("p1"); + assertEquals(bEntrySet.size(), 2); + assertFalse(bEntrySet.toString().contains("p1=1")); + assertTrue(bEntrySet.toString().trim().startsWith("[")); + assertTrue(bEntrySet.toString().contains("p0=0")); + assertTrue(bEntrySet.toString().contains("p2=2")); + assertTrue(bEntrySet.toString().trim().endsWith("]")); + + b.remove("p0", "0"); + assertEquals(bEntrySet.size(), 1); + assertFalse(bEntrySet.toString().contains("p0=0")); + assertTrue(bEntrySet.toString().trim().startsWith("[")); + assertTrue(bEntrySet.toString().contains("p2=2")); + assertTrue(bEntrySet.toString().trim().endsWith("]")); + + b.clear(); + assertTrue(bEntrySet.isEmpty()); + assertTrue(bEntrySet.toString().equals("[]")); + } + + @Test + public void testEntrySetWithoutException() { + Properties a = new Properties(); + a.setProperty("p1", "1"); + a.setProperty("p2", "2"); + var aEntrySet = a.entrySet(); + assertEquals(aEntrySet.size(), 2); + + var i = aEntrySet.iterator(); + var e1 = i.next(); + i.remove(); + assertFalse(aEntrySet.contains(e1)); + assertEquals(aEntrySet.size(), 1); + + var e2 = i.next(); + aEntrySet.remove(e2); + assertFalse(aEntrySet.contains(e2)); + assertTrue(aEntrySet.isEmpty()); + + a.setProperty("p1", "1"); + a.setProperty("p3", "3"); + Properties b = new Properties(); + b.setProperty("p2", "2"); + b.setProperty("p1", "1"); + var bEntrySet = b.entrySet(); + + assertFalse(bEntrySet.containsAll(aEntrySet)); + assertEquals(bEntrySet.size(), 2); + + assertTrue(bEntrySet.removeAll(aEntrySet)); + assertEquals(bEntrySet.size(), 1); + + assertTrue(bEntrySet.retainAll(aEntrySet)); + assertTrue(bEntrySet.isEmpty()); + assertEquals(aEntrySet.size(), 2); + + aEntrySet.clear(); + assertTrue(aEntrySet.isEmpty()); + } + + @Test + public void testEntrySetExceptionWhenAdd() { + Properties a = new Properties(); + a.setProperty("p1", "1"); + var aEntrySet = a.entrySet(); + + Properties b = new Properties(); + b.setProperty("p2", "2"); + var bEntrySet = b.entrySet(); + + assertThrows(UnsupportedOperationException.class, () -> aEntrySet.addAll(bEntrySet)); + assertThrows(UnsupportedOperationException.class, () -> aEntrySet.add(bEntrySet.iterator().next())); + } +} Best regards, Yu L. On Tue, Jun 9, 2020 at 10:42 AM Lisa Li <liyu.it...@gmail.com> wrote: > Thanks for all your suggestions Brent! They helped a lot. > > Best regards, > Yu L. > > On Tue, Jun 9, 2020 at 7:24 AM Brent Christian <brent.christ...@oracle.com> > wrote: > >> Looks good to me as well. Thanks for making the updates to the test case. >> >> -Brent >> >> On 6/8/20 2:38 AM, Julia Boes wrote: >> > Hi Yu Li, >> > >> > The copyright year of Properties.java needs to be updated to 2020. >> > Otherwise looks good to me! >> > >> > Cheers, >> > >> > Julia >> > >> >