/* * Copyright (c) 2005, 2015, 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 6292705 * @key intermittent * @summary Test support for arrays in parameterized types. * @author Luis-Miguel Alventosa * * @modules java.management.rmi * * @run clean GenericArrayTypeTest * @run build GenericArrayTypeTest * @run main GenericArrayTypeTest */ import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.management.Attribute; import javax.management.JMX; import javax.management.MBeanServer; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.StandardMBean; import javax.management.openmbean.CompositeData; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; public class GenericArrayTypeTest { // A version of java.lang.management.MonitorInfo so we can run this test // on JDK 5, where that class didn't exist. public static class MonitorInfo { private final String className; private final int identityHashCode; private final int lockedStackDepth; private final StackTraceElement lockedStackFrame; public MonitorInfo( String className, int identityHashCode, int lockedStackDepth, StackTraceElement lockedStackFrame) { this.className = className; this.identityHashCode = identityHashCode; this.lockedStackDepth = lockedStackDepth; this.lockedStackFrame = lockedStackFrame; } public static MonitorInfo from(CompositeData cd) { try { CompositeData stecd = (CompositeData) cd.get("lockedStackFrame"); StackTraceElement ste = new StackTraceElement( (String) stecd.get("className"), (String) stecd.get("methodName"), (String) stecd.get("fileName"), (Integer) stecd.get("lineNumber")); return new MonitorInfo( (String) cd.get("className"), (Integer) cd.get("identityHashCode"), (Integer) cd.get("lockedStackDepth"), ste); } catch (Exception e) { throw new RuntimeException(e); } } public String getClassName() { return className; } public int getIdentityHashCode() { return identityHashCode; } public int getLockedStackDepth() { return lockedStackDepth; } public StackTraceElement getLockedStackFrame() { return lockedStackFrame; } } public interface TestMXBean { public String[] getT1(); public void setT1(String[] v); public MonitorInfo[] getT2(); public void setT2(MonitorInfo[] v); public Map getT3(); public void setT3(Map v); public Map getT4(); public void setT4(Map v); public Set getT5(); public void setT5(Set v); public Set getT6(); public void setT6(Set v); public List getT7(); public void setT7(List v); public List getT8(); public void setT8(List v); public Set> getT9(); public void setT9(Set> v); public Set> getT10(); public void setT10(Set> v); public Map>> getT11(); public void setT11(Map>> v); public Map>> getT12(); public void setT12(Map>> v); } public static class Test implements TestMXBean { public String[] getT1() { return t1; } public void setT1(String[] v) { t1 = v; } private String[] t1; public MonitorInfo[] getT2() { return t2; } public void setT2(MonitorInfo[] v) { t2 = v; } private MonitorInfo[] t2; public Map getT3() { return t3; } public void setT3(Map v) { t3 = v; } private Map t3; public Map getT4() { return t4; } public void setT4(Map v) { t4 = v; } private Map t4; public Set getT5() { return t5; } public void setT5(Set v) { t5 = v; } private Set t5; public Set getT6() { return t6; } public void setT6(Set v) { t6 = v; } private Set t6; public List getT7() { return t7; } public void setT7(List v) { t7 = v; } private List t7; public List getT8() { return t8; } public void setT8(List v) { t8 = v; } private List t8; public Set> getT9() { return t9; } public void setT9(Set> v) { t9 = v; } private Set> t9; public Set> getT10() { return t10; } public void setT10(Set> v) { t10 = v; } private Set> t10; public Map>> getT11() { return t11; } public void setT11(Map>> v) { t11 = v; } private Map>> t11; public Map>> getT12() { return t12; } public void setT12(Map>> v) { t12 = v; } private Map>> t12; } public static void main(String[] args) throws Exception { int error = 0; JMXConnector cc = null; JMXConnectorServer cs = null; try { // Instantiate the MBean server // echo("\n>>> Create the MBean server"); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // Get default domain // echo("\n>>> Get the MBean server's default domain"); String domain = mbs.getDefaultDomain(); echo("\tDefault Domain = " + domain); // Register TestMXBean // echo("\n>>> Register TestMXBean"); ObjectName name = ObjectName.getInstance(domain + ":type=" + TestMXBean.class); mbs.createMBean(Test.class.getName(), name); // Create an RMI connector server // echo("\n>>> Create an RMI connector server"); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://"); cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); // Start the RMI connector server // echo("\n>>> Start the RMI connector server"); cs.start(); // Create an RMI connector client // echo("\n>>> Create an RMI connector client"); cc = JMXConnectorFactory.connect(cs.getAddress(), null); MBeanServerConnection mbsc = cc.getMBeanServerConnection(); // Create TestMXBean proxy // echo("\n>>> Create the TestMXBean proxy"); TestMXBean test = JMX.newMXBeanProxy(mbsc, name, TestMXBean.class); // Play with proxy getters and setters // echo("\n>>> Play with proxy getters and setters"); String[] t1 = new String[] { "t1" }; MonitorInfo[] t2 = new MonitorInfo[] { new MonitorInfo("dummy", 0, 0, new StackTraceElement("dummy", "dummy", "dummy", 0)) }; Map t3 = new HashMap(); t3.put("key", t1); Map t4 = new HashMap(); t4.put("key", t2); Set t5 = new HashSet(); t5.add(t1); Set t6 = new HashSet(); t6.add(t2); List t7 = new ArrayList(); t7.add(t1); List t8 = new ArrayList(); t8.add(t2); Set> t9 = new HashSet>(); t9.add(t7); Set> t10 = new HashSet>(); t10.add(t8); Map>> t11 = new HashMap>>(); t11.put("key", t9); Map>> t12 = new HashMap>>(); t12.put("key", t10); test.setT1(t1); test.setT2(t2); test.setT3(t3); test.setT4(t4); test.setT5(t5); test.setT6(t6); test.setT7(t7); test.setT8(t8); test.setT9(t9); test.setT10(t10); test.setT11(t11); test.setT12(t12); String r; String e1 = "t1"; String e2 = "dummy"; echo("\tT1 = " + test.getT1()); r = ((String[])test.getT1())[0]; echo("\tR1 = " + r); if (!e1.equals(r)) error++; echo("\tT2 = " + test.getT2()); r = ((MonitorInfo[])test.getT2())[0].getClassName(); echo("\tR2 = " + r); if (!e2.equals(r)) error++; echo("\tT3 = " + test.getT3()); r = ((String[])((Map)test.getT3()).get("key"))[0]; echo("\tR3 = " + r); if (!e1.equals(r)) error++; echo("\tT4 = " + test.getT4()); r = ((MonitorInfo[])((Map)test.getT4()).get("key"))[0].getClassName(); echo("\tR4 = " + r); if (!e2.equals(r)) error++; echo("\tT5 = " + test.getT5()); r = ((String[])((Set)test.getT5()).iterator().next())[0]; echo("\tR5 = " + r); if (!e1.equals(r)) error++; echo("\tT6 = " + test.getT6()); r = ((MonitorInfo[])((Set)test.getT6()).iterator().next())[0].getClassName(); echo("\tR6 = " + r); if (!e2.equals(r)) error++; echo("\tT7 = " + test.getT7()); r = ((String[])((List)test.getT7()).get(0))[0]; echo("\tR7 = " + r); if (!e1.equals(r)) error++; echo("\tT8 = " + test.getT8()); r = ((MonitorInfo[])((List)test.getT8()).get(0))[0].getClassName(); echo("\tR8 = " + r); if (!e2.equals(r)) error++; echo("\tT9 = " + test.getT9()); r = ((String[])((List)((Set>)test.getT9()).iterator().next()).get(0))[0]; echo("\tR9 = " + r); if (!e1.equals(r)) error++; echo("\tT10 = " + test.getT10()); r = ((MonitorInfo[])((List)((Set>)test.getT10()).iterator().next()).get(0))[0].getClassName(); echo("\tR10 = " + r); if (!e2.equals(r)) error++; echo("\tT11 = " + test.getT11()); r = ((String[])((List)((Set>)((Map>>)test.getT11()).get("key")).iterator().next()).get(0))[0]; echo("\tR11 = " + r); if (!e1.equals(r)) error++; echo("\tT12 = " + test.getT12()); r = ((MonitorInfo[])((List)((Set>)((Map>>)test.getT12()).get("key")).iterator().next()).get(0))[0].getClassName(); echo("\tR12 = " + r); if (!e2.equals(r)) error++; } catch (Exception e) { e.printStackTrace(System.out); error++; } finally { // Close client // echo("\n>>> Close the RMI connector client"); if (cc != null) cc.close(); // Stop server // echo("\n>>> Stop the RMI connector server"); if (cs != null) cs.stop(); echo("\n>>> Bye! Bye!"); } if (error > 0) { echo("\nTest failed! " + error + " errors.\n"); throw new IllegalArgumentException("Test failed"); } else { echo("\nTest passed!\n"); } } private static void echo(String msg) { System.out.println(msg); } }