1 /* 2 * Copyright (c) 2004, 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 4969756 27 * @summary Test that the same native library coming from the same jar file can 28 * be loaded twice by two different MLets on the same JVM without conflict. 29 * @author Luis-Miguel Alventosa 30 * 31 * @run clean LibraryLoaderTest 32 * @run build LibraryLoaderTest 33 * @run main/othervm LibraryLoaderTest 34 */ 35 36 import java.io.File; 37 import java.util.Set; 38 import javax.management.Attribute; 39 import javax.management.MBeanServer; 40 import javax.management.MBeanServerFactory; 41 import javax.management.ObjectInstance; 42 import javax.management.ObjectName; 43 import javax.management.ReflectionException; 44 45 public class LibraryLoaderTest { 46 47 private static final String mletInfo[][] = { 48 {"testDomain:type=MLet,index=0", "UseNativeLib0.html"}, 49 {"testDomain:type=MLet,index=1", "UseNativeLib1.html"} 50 }; 51 52 public static void main(String args[]) throws Exception { 53 54 String osName = System.getProperty("os.name"); 55 System.out.println("os.name=" + osName); 56 String osArch = System.getProperty("os.arch"); 57 System.out.println("os.name=" + osArch); 58 59 // Check for supported platforms: 60 // 61 // Solaris/SPARC and Windows/x86 62 // 63 if ((!(osName.equals("SunOS") && osArch.equals("sparc"))) && 64 (!(osName.startsWith("Windows") && osArch.equals("x86")))) { 65 System.out.println( 66 "This test runs only on Solaris/SPARC and Windows/x86 platforms"); 67 System.out.println("Bye! Bye!"); 68 return; 69 } 70 71 String libPath = System.getProperty("java.library.path"); 72 System.out.println("java.library.path=" + libPath); 73 String testSrc = System.getProperty("test.src"); 74 System.out.println("test.src=" + testSrc); 75 String workingDir = System.getProperty("user.dir"); 76 System.out.println("user.dir=" + workingDir); 77 78 String urlCodebase; 79 if (testSrc.startsWith("/")) { 80 urlCodebase = 81 "file:" + testSrc.replace(File.separatorChar, '/') + "/"; 82 } else { 83 urlCodebase = 84 "file:/" + testSrc.replace(File.separatorChar, '/') + "/"; 85 } 86 87 // Create MBeanServer 88 // 89 MBeanServer server = MBeanServerFactory.newMBeanServer(); 90 91 // Create MLet instances and call getRandom on the loaded MBeans 92 // 93 for (int i = 0; i < mletInfo.length; i++) { 94 // Create ObjectName for MLet 95 // 96 ObjectName mlet = new ObjectName(mletInfo[i][0]); 97 server.createMBean("javax.management.loading.MLet", mlet); 98 System.out.println("MLet = " + mlet); 99 100 // Display old library directory and set it to test.classes 101 // 102 String libraryDirectory = 103 (String) server.getAttribute(mlet, "LibraryDirectory"); 104 System.out.println("Old Library Directory = " + 105 libraryDirectory); 106 Attribute attribute = 107 new Attribute("LibraryDirectory", workingDir); 108 server.setAttribute(mlet, attribute); 109 libraryDirectory = 110 (String) server.getAttribute(mlet, "LibraryDirectory"); 111 System.out.println("New Library Directory = " + 112 libraryDirectory); 113 114 // Get MBeans from URL 115 // 116 String mletURL = urlCodebase + mletInfo[i][1]; 117 System.out.println("MLet URL = " + mletURL); 118 Object[] params = new Object[] { mletURL }; 119 String[] signature = new String[] {"java.lang.String"}; 120 Object res[] = ((Set<?>) server.invoke(mlet, 121 "getMBeansFromURL", 122 params, 123 signature)).toArray(); 124 125 // Iterate through all the loaded MBeans 126 // 127 for (int j = 0; j < res.length; j++) { 128 // Now ensure none of the returned objects is a Throwable 129 // 130 if (res[j] instanceof Throwable) { 131 ((Throwable) res[j]).printStackTrace(System.out); 132 throw new Exception("Failed to load the MBean #" + j 133 ,(Throwable)res[j]); 134 } 135 136 // On each of the loaded MBeans, try to invoke their 137 // native operation 138 // 139 Object result = null; 140 try { 141 ObjectName mbean = 142 ((ObjectInstance) res[j]).getObjectName(); 143 result = server.getAttribute(mbean, "Random"); 144 System.out.println("MBean #" + j + " = " + mbean); 145 System.out.println("Random number = " + result); 146 } catch (ReflectionException e) { 147 e.getTargetException().printStackTrace(System.out); 148 throw new Exception ("A ReflectionException " 149 + "occured when attempting to invoke " 150 + "a native library based operation.", 151 e.getTargetException()); 152 } 153 } 154 } 155 } 156 }