jdk/src/share/classes/javax/management/remote/rmi/RMIConnectionImpl.java
changeset 14223 754dc892778f
parent 14211 10681074e61b
child 18205 17a6d802d24a
equal deleted inserted replaced
14222:58f55d4dde46 14223:754dc892778f
     1 /*
     1 /*
     2  * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     7  * published by the Free Software Foundation.  Oracle designates this
   142 
   142 
   143                 withPermissions( new MBeanPermission("*", "getClassLoaderRepository"),
   143                 withPermissions( new MBeanPermission("*", "getClassLoaderRepository"),
   144                                  new RuntimePermission("createClassLoader"))
   144                                  new RuntimePermission("createClassLoader"))
   145             );
   145             );
   146 
   146 
       
   147 
       
   148         this.defaultContextClassLoader =
       
   149             AccessController.doPrivileged(
       
   150                 new PrivilegedAction<ClassLoader>() {
       
   151             @Override
       
   152                     public ClassLoader run() {
       
   153                         return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(),
       
   154                                 dcl);
       
   155                     }
       
   156                 });
       
   157 
   147         serverCommunicatorAdmin = new
   158         serverCommunicatorAdmin = new
   148           RMIServerCommunicatorAdmin(EnvHelp.getServerConnectionTimeout(env));
   159           RMIServerCommunicatorAdmin(EnvHelp.getServerConnectionTimeout(env));
   149 
   160 
   150         this.env = env;
   161         this.env = env;
   151     }
   162     }
   508 
   519 
   509         if (debug) logger.debug("queryMBeans",
   520         if (debug) logger.debug("queryMBeans",
   510                  "connectionId=" + connectionId
   521                  "connectionId=" + connectionId
   511                  +" unwrapping query with defaultClassLoader.");
   522                  +" unwrapping query with defaultClassLoader.");
   512 
   523 
   513         queryValue = unwrap(query, defaultClassLoader, QueryExp.class);
   524         queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class);
   514 
   525 
   515         try {
   526         try {
   516             final Object params[] = new Object[] { name, queryValue };
   527             final Object params[] = new Object[] { name, queryValue };
   517 
   528 
   518             if (debug) logger.debug("queryMBeans",
   529             if (debug) logger.debug("queryMBeans",
   543 
   554 
   544         if (debug) logger.debug("queryNames",
   555         if (debug) logger.debug("queryNames",
   545                  "connectionId=" + connectionId
   556                  "connectionId=" + connectionId
   546                  +" unwrapping query with defaultClassLoader.");
   557                  +" unwrapping query with defaultClassLoader.");
   547 
   558 
   548         queryValue = unwrap(query, defaultClassLoader, QueryExp.class);
   559         queryValue = unwrap(query, defaultContextClassLoader, QueryExp.class);
   549 
   560 
   550         try {
   561         try {
   551             final Object params[] = new Object[] { name, queryValue };
   562             final Object params[] = new Object[] { name, queryValue };
   552 
   563 
   553             if (debug) logger.debug("queryNames",
   564             if (debug) logger.debug("queryNames",
  1577         }
  1588         }
  1578         try {
  1589         try {
  1579             ClassLoader orderCL = AccessController.doPrivileged(
  1590             ClassLoader orderCL = AccessController.doPrivileged(
  1580                 new PrivilegedExceptionAction<ClassLoader>() {
  1591                 new PrivilegedExceptionAction<ClassLoader>() {
  1581                     public ClassLoader run() throws Exception {
  1592                     public ClassLoader run() throws Exception {
  1582                         return new OrderClassLoaders(cl1, cl2);
  1593                         return new CombinedClassLoader(Thread.currentThread().getContextClassLoader(),
       
  1594                                 new OrderClassLoaders(cl1, cl2));
  1583                     }
  1595                     }
  1584                 }
  1596                 }
  1585             );
  1597             );
  1586             return unwrap(mo, orderCL, wrappedClass);
  1598             return unwrap(mo, orderCL, wrappedClass);
  1587         } catch (PrivilegedActionException pe) {
  1599         } catch (PrivilegedActionException pe) {
  1669 
  1681 
  1670     private final MBeanServer mbeanServer;
  1682     private final MBeanServer mbeanServer;
  1671 
  1683 
  1672     private final ClassLoader defaultClassLoader;
  1684     private final ClassLoader defaultClassLoader;
  1673 
  1685 
       
  1686     private final ClassLoader defaultContextClassLoader;
       
  1687 
  1674     private final ClassLoaderWithRepository classLoaderWithRepository;
  1688     private final ClassLoaderWithRepository classLoaderWithRepository;
  1675 
  1689 
  1676     private boolean terminated = false;
  1690     private boolean terminated = false;
  1677 
  1691 
  1678     private final String connectionId;
  1692     private final String connectionId;
  1751         return objects(strs);
  1765         return objects(strs);
  1752     }
  1766     }
  1753 
  1767 
  1754     private static final ClassLogger logger =
  1768     private static final ClassLogger logger =
  1755         new ClassLogger("javax.management.remote.rmi", "RMIConnectionImpl");
  1769         new ClassLogger("javax.management.remote.rmi", "RMIConnectionImpl");
       
  1770 
       
  1771     private static final class CombinedClassLoader extends ClassLoader {
       
  1772 
       
  1773         private final static class ClassLoaderWrapper extends ClassLoader {
       
  1774             ClassLoaderWrapper(ClassLoader cl) {
       
  1775                 super(cl);
       
  1776             }
       
  1777 
       
  1778             @Override
       
  1779             protected Class<?> loadClass(String name, boolean resolve)
       
  1780                     throws ClassNotFoundException {
       
  1781                 return super.loadClass(name, resolve);
       
  1782             }
       
  1783         };
       
  1784 
       
  1785         final ClassLoaderWrapper defaultCL;
       
  1786 
       
  1787         private CombinedClassLoader(ClassLoader parent, ClassLoader defaultCL) {
       
  1788             super(parent);
       
  1789             this.defaultCL = new ClassLoaderWrapper(defaultCL);
       
  1790         }
       
  1791 
       
  1792         @Override
       
  1793         protected Class<?> loadClass(String name, boolean resolve)
       
  1794         throws ClassNotFoundException {
       
  1795             try {
       
  1796                 super.loadClass(name, resolve);
       
  1797             } catch(Exception e) {
       
  1798                 for(Throwable t = e; t != null; t = t.getCause()) {
       
  1799                     if(t instanceof SecurityException) {
       
  1800                         throw t==e?(SecurityException)t:new SecurityException(t.getMessage(), e);
       
  1801                     }
       
  1802                 }
       
  1803             }
       
  1804             final Class<?> cl = defaultCL.loadClass(name, resolve);
       
  1805             return cl;
       
  1806         }
       
  1807 
       
  1808     }
  1756 }
  1809 }