1 /*
   2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 import java.beans.Introspector;
  25 import java.io.Serializable;
  26 import java.lang.reflect.Field;
  27 import java.lang.reflect.Method;
  28 import java.util.AbstractCollection;
  29 import java.util.AbstractList;
  30 import java.util.ArrayList;
  31 import java.util.Collection;
  32 import java.util.Comparator;
  33 import java.util.List;
  34 import java.util.RandomAccess;
  35 
  36 /**
  37  * @test
  38  * @bug 8211147
  39  * @modules java.desktop/com.sun.beans.introspect:open
  40  */
  41 public final class MethodOrderException {
  42 
  43     public static void main(final String[] args) throws Exception {
  44         // Public API, fails rarely
  45         testPublicAPI();
  46         // Test using internal API, fails always
  47         testPrivateAPI();
  48     }
  49 
  50     private static void testPublicAPI() throws Exception {
  51         Introspector.getBeanInfo(X.class);
  52     }
  53 
  54     private static void testPrivateAPI() throws Exception {
  55         Class<?> name = Class.forName(
  56                 "com.sun.beans.introspect.MethodInfo$MethodOrder");
  57         Field instance = name.getDeclaredField("instance");
  58         instance.setAccessible(true);
  59         Comparator<Method> o = (Comparator) instance.get(name);
  60         List<Method> methods = List.of(X.class.getDeclaredMethods());
  61         methods.forEach(m1 -> {
  62             methods.forEach(m2 -> {
  63                 if (o.compare(m1, m2) != -o.compare(m2, m1)) {
  64                     System.err.println("Method1 = "+ m1);
  65                     System.err.println("Method2 = "+ m2);
  66                     throw new RuntimeException("Broken contract!");
  67                 }
  68             });
  69         });
  70     }
  71 
  72     interface X_1 {
  73 
  74         AbstractList x_8();
  75     }
  76     interface X_2 {
  77 
  78         Cloneable x_0();
  79     }
  80     interface X_3 {
  81 
  82         Serializable x_1();
  83     }
  84     interface X_4 {
  85 
  86         Object x_7();
  87     }
  88     interface X_5 {
  89 
  90         RandomAccess x_6();
  91     }
  92     interface X_6 {
  93 
  94         RandomAccess x_0();
  95     }
  96     interface X_7 {
  97 
  98         Serializable x_5();
  99     }
 100     interface X_8 {
 101 
 102         Object x_4();
 103     }
 104     interface X_9 {
 105 
 106         RandomAccess x_5();
 107     }
 108     interface X_10 {
 109 
 110         Cloneable x_5();
 111     }
 112     interface X_11 {
 113 
 114         RandomAccess x_9();
 115     }
 116     interface X_12 {
 117 
 118         Cloneable x_9();
 119     }
 120     interface X_13 {
 121 
 122         Iterable x_2();
 123     }
 124     interface X_14 {
 125 
 126         Collection x_7();
 127     }
 128     interface X_15 {
 129 
 130         Serializable x_4();
 131     }
 132     interface X_16 {
 133 
 134         Cloneable x_7();
 135     }
 136     interface X_17 {
 137 
 138         Object x_1();
 139     }
 140     interface X_18 {
 141 
 142         ArrayList x_6();
 143     }
 144     interface X_19 {
 145 
 146         List x_5();
 147     }
 148     interface X_20 {
 149 
 150         Collection x_2();
 151     }
 152     interface X_21 {
 153 
 154         List x_1();
 155     }
 156     interface X_22 {
 157 
 158         List x_3();
 159     }
 160     interface X_23 {
 161 
 162         RandomAccess x_3();
 163     }
 164     interface X_24 {
 165 
 166         RandomAccess x_1();
 167     }
 168     interface X_25 {
 169 
 170         Object x_6();
 171     }
 172     interface X_26 {
 173 
 174         Cloneable x_7();
 175     }
 176     interface X_27 {
 177 
 178         Iterable x_0();
 179     }
 180     interface X_28 {
 181 
 182         Iterable x_1();
 183     }
 184     interface X_29 {
 185 
 186         AbstractList x_7();
 187     }
 188     interface X_30 {
 189 
 190         AbstractList x_1();
 191     }
 192     interface X_31 {
 193 
 194         Cloneable x_9();
 195     }
 196     interface X_32 {
 197 
 198         ArrayList x_6();
 199     }
 200     interface X_33 {
 201 
 202         Cloneable x_2();
 203     }
 204     interface X_34 {
 205 
 206         Iterable x_6();
 207     }
 208     interface X_35 {
 209 
 210         Iterable x_9();
 211     }
 212     interface X_36 {
 213 
 214         AbstractList x_9();
 215     }
 216     interface X_37 {
 217 
 218         Iterable x_7();
 219     }
 220     interface X_38 {
 221 
 222         Iterable x_3();
 223     }
 224     interface X_39 {
 225 
 226         Iterable x_9();
 227     }
 228     interface X_40 {
 229 
 230         AbstractList x_3();
 231     }
 232     interface X_41 {
 233 
 234         List x_0();
 235     }
 236     interface X_42 {
 237 
 238         Iterable x_0();
 239     }
 240     interface X_43 {
 241 
 242         Iterable x_2();
 243     }
 244     interface X_44 {
 245 
 246         ArrayList x_4();
 247     }
 248     interface X_45 {
 249 
 250         AbstractList x_4();
 251     }
 252     interface X_46 {
 253 
 254         Collection x_4();
 255     }
 256     interface X_47 {
 257 
 258         ArrayList x_2();
 259     }
 260     interface X_48 {
 261 
 262         ArrayList x_6();
 263     }
 264     interface X_49 {
 265 
 266         Serializable x_1();
 267     }
 268     interface X_50 {
 269 
 270         Cloneable x_7();
 271     }
 272     interface X_51 {
 273 
 274         Collection x_5();
 275     }
 276     interface X_52 {
 277 
 278         RandomAccess x_5();
 279     }
 280     interface X_53 {
 281 
 282         Collection x_5();
 283     }
 284     interface X_54 {
 285 
 286         RandomAccess x_4();
 287     }
 288     interface X_55 {
 289 
 290         Collection x_0();
 291     }
 292     interface X_56 {
 293 
 294         Collection x_7();
 295     }
 296     interface X_57 {
 297 
 298         Iterable x_9();
 299     }
 300     interface X_58 {
 301 
 302         List x_3();
 303     }
 304     interface X_59 {
 305 
 306         Serializable x_7();
 307     }
 308     interface X_60 {
 309 
 310         AbstractCollection x_6();
 311     }
 312     interface X_61 {
 313 
 314         AbstractList x_9();
 315     }
 316     interface X_62 {
 317 
 318         List x_7();
 319     }
 320     interface X_63 {
 321 
 322         AbstractCollection x_3();
 323     }
 324     interface X_64 {
 325 
 326         RandomAccess x_4();
 327     }
 328     interface X_65 {
 329 
 330         Object x_3();
 331     }
 332     interface X_66 {
 333 
 334         RandomAccess x_6();
 335     }
 336     interface X_67 {
 337 
 338         Cloneable x_6();
 339     }
 340     interface X_68 {
 341 
 342         Cloneable x_3();
 343     }
 344     interface X_69 {
 345 
 346         Collection x_5();
 347     }
 348     interface X_70 {
 349 
 350         AbstractCollection x_0();
 351     }
 352     interface X_71 {
 353 
 354         Object x_8();
 355     }
 356     interface X_72 {
 357 
 358         AbstractCollection x_3();
 359     }
 360     interface X_73 {
 361 
 362         Serializable x_4();
 363     }
 364     interface X_74 {
 365 
 366         AbstractList x_8();
 367     }
 368     interface X_75 {
 369 
 370         ArrayList x_1();
 371     }
 372     interface X_76 {
 373 
 374         List x_5();
 375     }
 376     interface X_77 {
 377 
 378         Object x_0();
 379     }
 380     interface X_78 {
 381 
 382         Collection x_0();
 383     }
 384     interface X_79 {
 385 
 386         ArrayList x_2();
 387     }
 388     interface X_80 {
 389 
 390         ArrayList x_8();
 391     }
 392     interface X_81 {
 393 
 394         Cloneable x_3();
 395     }
 396     interface X_82 {
 397 
 398         Serializable x_1();
 399     }
 400     interface X_83 {
 401 
 402         List x_1();
 403     }
 404     interface X_84 {
 405 
 406         Collection x_5();
 407     }
 408     interface X_85 {
 409 
 410         RandomAccess x_9();
 411     }
 412     interface X_86 {
 413 
 414         AbstractList x_3();
 415     }
 416     interface X_87 {
 417 
 418         Cloneable x_6();
 419     }
 420     interface X_88 {
 421 
 422         Object x_2();
 423     }
 424     interface X_89 {
 425 
 426         ArrayList x_5();
 427     }
 428     interface X_90 {
 429 
 430         Iterable x_1();
 431     }
 432     interface X_91 {
 433 
 434         ArrayList x_4();
 435     }
 436     interface X_92 {
 437 
 438         Iterable x_6();
 439     }
 440     interface X_93 {
 441 
 442         Collection x_7();
 443     }
 444     interface X_94 {
 445 
 446         Iterable x_2();
 447     }
 448     interface X_95 {
 449 
 450         AbstractList x_7();
 451     }
 452     interface X_96 {
 453 
 454         RandomAccess x_2();
 455     }
 456     interface X_97 {
 457 
 458         RandomAccess x_2();
 459     }
 460     interface X_98 {
 461 
 462         List x_6();
 463     }
 464     interface X_99 {
 465 
 466         Object x_4();
 467     }
 468     interface X_100 {
 469 
 470         Collection x_7();
 471     }
 472     static class X
 473             implements X_1, X_2, X_3, X_4, X_5, X_6, X_7, X_8, X_9, X_10, X_11,
 474                        X_12, X_13, X_14, X_15, X_16, X_17, X_18, X_19, X_20,
 475                        X_21, X_22, X_23, X_24, X_25, X_26, X_27, X_28, X_29,
 476                        X_30, X_31, X_32, X_33, X_34, X_35, X_36, X_37, X_38,
 477                        X_39, X_40, X_41, X_42, X_43, X_44, X_45, X_46, X_47,
 478                        X_48, X_49, X_50, X_51, X_52, X_53, X_54, X_55, X_56,
 479                        X_57, X_58, X_59, X_60, X_61, X_62, X_63, X_64, X_65,
 480                        X_66, X_67, X_68, X_69, X_70, X_71, X_72, X_73, X_74,
 481                        X_75, X_76, X_77, X_78, X_79, X_80, X_81, X_82, X_83,
 482                        X_84, X_85, X_86, X_87, X_88, X_89, X_90, X_91, X_92,
 483                        X_93, X_94, X_95, X_96, X_97, X_98, X_99, X_100 {
 484 
 485         public ArrayList x_0() {
 486             return null;
 487         }
 488 
 489         public ArrayList x_1() {
 490             return null;
 491         }
 492 
 493         public ArrayList x_2() {
 494             return null;
 495         }
 496 
 497         public ArrayList x_3() {
 498             return null;
 499         }
 500 
 501         public ArrayList x_4() {
 502             return null;
 503         }
 504 
 505         public ArrayList x_5() {
 506             return null;
 507         }
 508 
 509         public ArrayList x_6() {
 510             return null;
 511         }
 512 
 513         public ArrayList x_7() {
 514             return null;
 515         }
 516 
 517         public ArrayList x_8() {
 518             return null;
 519         }
 520 
 521         public ArrayList x_9() {
 522             return null;
 523         }
 524     }
 525 }