1 /*
   2  * Copyright (c) 2005, 2015, 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 /*
  25  * @test
  26  * @bug 6175517 6278707
  27  * @summary Test that ambiguous ConstructorProperties annotations are detected.
  28  * @author Eamonn McManus
  29  * @modules java.management
  30  * @run clean AmbiguousConstructorTest
  31  * @run build AmbiguousConstructorTest
  32  * @run main AmbiguousConstructorTest
  33  */
  34 
  35 import javax.management.ConstructorParameters;
  36 import javax.management.*;
  37 
  38 public class AmbiguousConstructorTest {
  39     public static void main(String[] args) throws Exception {
  40         MBeanServer mbs = MBeanServerFactory.newMBeanServer();
  41 
  42         System.out.println("Unambiguous case:");
  43         ObjectName unambigName = new ObjectName("d:type=Unambiguous");
  44         mbs.registerMBean(new UnambiguousImpl(), unambigName);
  45         System.out.println("...OK");
  46 
  47         System.out.println("Ambiguous case:");
  48         ObjectName ambigName = new ObjectName("d:type=Ambiguous");
  49         boolean exception = false;
  50         try {
  51             mbs.registerMBean(new AmbiguousImpl(), ambigName);
  52         } catch (Exception e) {
  53             // TODO - check for the specific exception we should get.
  54             // Currently exception happens in preRegister so we have
  55             // RuntimeMBeanException -> IllegalArgumentException ->
  56             // InvalidObjectException, where the IllegalArgumentException
  57             // is thrown by MXSupport.MBeanDispatcher.visitAttribute when
  58             // it calls ConvertingMethod.checkCallFromOpen
  59             System.out.println("...OK, got expected exception:");
  60             e.printStackTrace(System.out);
  61             exception = true;
  62         }
  63         if (!exception) {
  64             System.out.println("TEST FAILED: expected exception, got none");
  65             throw new Exception("Did not get expected exception");
  66         }
  67 
  68         System.out.println("TEST PASSED");
  69     }
  70 
  71     public static class Unambiguous {
  72         public byte getA() {return 0;}
  73         public short getB() {return 0;}
  74         public int getC() {return 0;}
  75         public long getD() {return 0;}
  76 
  77         @ConstructorParameters({"a", "b"})
  78         public Unambiguous(byte a, short b) {}
  79 
  80         @ConstructorParameters({"b", "c"})
  81         public Unambiguous(short b, int c) {}
  82 
  83         @ConstructorParameters({"a", "b", "c"})
  84         public Unambiguous(byte a, short b, int c) {}
  85     }
  86 
  87     public static class Ambiguous {
  88         public byte getA() {return 0;}
  89         public short getB() {return 0;}
  90         public int getC() {return 0;}
  91         public long getD() {return 0;}
  92 
  93         @ConstructorParameters({"a", "b"})
  94         public Ambiguous(byte a, short b) {}
  95 
  96         @ConstructorParameters({"b", "c"})
  97         public Ambiguous(short b, int c) {}
  98 
  99         @ConstructorParameters({"a", "b", "c", "d"})
 100         public Ambiguous(byte a, short b, int c, long d) {}
 101     }
 102 
 103     public static interface UnambiguousMXBean {
 104         public void setUnambiguous(Unambiguous x);
 105     }
 106 
 107     public static class UnambiguousImpl implements UnambiguousMXBean {
 108         public void setUnambiguous(Unambiguous x) {}
 109     }
 110 
 111     public static interface AmbiguousMXBean {
 112         public void setAmbiguous(Ambiguous x);
 113     }
 114 
 115     public static class AmbiguousImpl implements AmbiguousMXBean {
 116         public void setAmbiguous(Ambiguous x) {}
 117     }
 118 }