home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &… the Search for Life CD 3 / 0_CD-ROM.iso / install / jre1_3 / lib / rt.jar / sun / rmi / server / LoaderHandler.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  8.2 KB  |  338 lines

  1. package sun.rmi.server;
  2.  
  3. import java.io.File;
  4. import java.io.FilePermission;
  5. import java.io.IOException;
  6. import java.lang.ref.Reference;
  7. import java.lang.ref.ReferenceQueue;
  8. import java.lang.ref.SoftReference;
  9. import java.net.MalformedURLException;
  10. import java.net.SocketPermission;
  11. import java.net.URL;
  12. import java.net.URLClassLoader;
  13. import java.rmi.server.LogStream;
  14. import java.security.AccessControlContext;
  15. import java.security.AccessController;
  16. import java.security.CodeSource;
  17. import java.security.Permission;
  18. import java.security.PermissionCollection;
  19. import java.security.ProtectionDomain;
  20. import java.security.cert.Certificate;
  21. import java.util.Arrays;
  22. import java.util.Collections;
  23. import java.util.HashMap;
  24. import java.util.Map;
  25. import java.util.PropertyPermission;
  26. import java.util.StringTokenizer;
  27. import java.util.WeakHashMap;
  28. import sun.security.action.GetPropertyAction;
  29.  
  30. public final class LoaderHandler {
  31.    static final int logLevel = LogStream.parseLevel((String)AccessController.doPrivileged(new GetPropertyAction("sun.rmi.loader.logLevel")));
  32.    private static String codebase = null;
  33.    private static URL[] codebaseURLs;
  34.    private static Map codebaseLoaders;
  35.    private static HashMap loaderTable;
  36.    private static ReferenceQueue refQueue;
  37.    private static Map pathToURLsCache;
  38.    // $FF: synthetic field
  39.    static Class class$sun$rmi$server$LoaderHandler;
  40.  
  41.    private LoaderHandler() {
  42.    }
  43.  
  44.    public static Class loadClass(String var0) throws MalformedURLException, ClassNotFoundException {
  45.       return loadClass(getDefaultCodebaseURLs(), var0);
  46.    }
  47.  
  48.    private static synchronized URL[] getDefaultCodebaseURLs() throws MalformedURLException {
  49.       if (codebaseURLs == null) {
  50.          if (codebase != null) {
  51.             codebaseURLs = pathToURLs(codebase);
  52.          } else {
  53.             codebaseURLs = new URL[0];
  54.          }
  55.       }
  56.  
  57.       return codebaseURLs;
  58.    }
  59.  
  60.    public static Class loadClass(URL var0, String var1) throws MalformedURLException, ClassNotFoundException {
  61.       return var0 != null ? loadClass(new URL[]{var0}, var1) : loadClass(var1);
  62.    }
  63.  
  64.    public static Class loadClass(String var0, String var1) throws MalformedURLException, ClassNotFoundException {
  65.       return var0 != null ? loadClass(pathToURLs(var0), var1) : loadClass(var1);
  66.    }
  67.  
  68.    public static String getClassAnnotation(Class var0) {
  69.       String var1 = var0.getName();
  70.       int var2 = var1.length();
  71.       if (var2 > 0 && var1.charAt(0) == '[') {
  72.          int var3;
  73.          for(var3 = 1; var2 > var3 && var1.charAt(var3) == '['; ++var3) {
  74.          }
  75.  
  76.          if (var2 > var3 && var1.charAt(var3) != 'L') {
  77.             return null;
  78.          }
  79.       }
  80.  
  81.       ClassLoader var11 = var0.getClassLoader();
  82.       if (var11 != null && !codebaseLoaders.containsKey(var11)) {
  83.          String var4 = null;
  84.          if (var11 instanceof Loader) {
  85.             var4 = ((Loader)var11).getClassAnnotation();
  86.          } else if (var11 instanceof URLClassLoader) {
  87.             try {
  88.                URL[] var5 = ((URLClassLoader)var11).getURLs();
  89.                if (var5 != null) {
  90.                   SecurityManager var6 = System.getSecurityManager();
  91.                   if (var6 != null) {
  92.                      for(int var7 = 0; var7 < var5.length; ++var7) {
  93.                         Permission var8 = var5[var7].openConnection().getPermission();
  94.                         if (var8 != null) {
  95.                            var6.checkPermission(var8);
  96.                         }
  97.                      }
  98.                   }
  99.  
  100.                   var4 = urlsToPath(var5);
  101.                }
  102.             } catch (SecurityException var9) {
  103.             } catch (IOException var10) {
  104.             }
  105.          }
  106.  
  107.          return var4 != null ? var4 : codebase;
  108.       } else {
  109.          return codebase;
  110.       }
  111.    }
  112.  
  113.    public static ClassLoader getClassLoader(String var0) throws MalformedURLException, SecurityException {
  114.       ClassLoader var1 = getRMIContextClassLoader();
  115.       SecurityManager var2 = System.getSecurityManager();
  116.       if (var2 == null) {
  117.          return var1;
  118.       } else {
  119.          URL[] var3;
  120.          if (var0 != null) {
  121.             var3 = pathToURLs(var0);
  122.          } else {
  123.             var3 = getDefaultCodebaseURLs();
  124.          }
  125.  
  126.          Loader var4 = lookupLoader(var3, var1);
  127.          if (var4 != null) {
  128.             sun.rmi.server.LoaderHandler.Loader.access$000(var4);
  129.          }
  130.  
  131.          return var4;
  132.       }
  133.    }
  134.  
  135.    public static Object getSecurityContext(ClassLoader var0) {
  136.       if (var0 instanceof Loader) {
  137.          URL[] var1 = ((Loader)var0).getURLs();
  138.          if (var1.length > 0) {
  139.             return var1[0];
  140.          }
  141.       }
  142.  
  143.       return null;
  144.    }
  145.  
  146.    public static void registerCodebaseLoader(ClassLoader var0) {
  147.       codebaseLoaders.put(var0, (Object)null);
  148.    }
  149.  
  150.    private static Class loadClass(URL[] var0, String var1) throws ClassNotFoundException {
  151.       ClassLoader var2 = getRMIContextClassLoader();
  152.       SecurityManager var3 = System.getSecurityManager();
  153.       if (var3 == null) {
  154.          try {
  155.             return Class.forName(var1, false, var2);
  156.          } catch (ClassNotFoundException var6) {
  157.             throw new ClassNotFoundException(((Throwable)var6).getMessage() + " (no security manager: RMI class loader disabled)", var6.getException());
  158.          }
  159.       } else {
  160.          Loader var4 = lookupLoader(var0, var2);
  161.          if (logLevel >= 20) {
  162.             LogStream.log("loader").println("LoaderHandler.loadClass: loading class \"" + var1 + "\"" + " from " + Arrays.asList(var0));
  163.          }
  164.  
  165.          try {
  166.             if (var4 != null) {
  167.                sun.rmi.server.LoaderHandler.Loader.access$000(var4);
  168.             }
  169.          } catch (SecurityException var7) {
  170.             throw new ClassNotFoundException("access denied to class loader", var7);
  171.          }
  172.  
  173.          return Class.forName(var1, false, var4);
  174.       }
  175.    }
  176.  
  177.    private static URL[] pathToURLs(String var0) throws MalformedURLException {
  178.       Map var1 = pathToURLsCache;
  179.       synchronized(var1) {
  180.          Object[] var2 = pathToURLsCache.get(var0);
  181.          if (var2 != null) {
  182.             URL[] var10 = (URL[])var2[0];
  183.             return var10;
  184.          }
  185.       }
  186.  
  187.       StringTokenizer var9 = new StringTokenizer(var0);
  188.       URL[] var3 = new URL[var9.countTokens()];
  189.  
  190.       for(int var4 = 0; var9.hasMoreTokens(); ++var4) {
  191.          var3[var4] = new URL(var9.nextToken());
  192.       }
  193.  
  194.       Map var5 = pathToURLsCache;
  195.       synchronized(var5) {
  196.          pathToURLsCache.put(var0, new Object[]{var3, new SoftReference(var0)});
  197.          return var3;
  198.       }
  199.    }
  200.  
  201.    private static String urlsToPath(URL[] var0) {
  202.       if (var0.length == 0) {
  203.          return null;
  204.       } else if (var0.length == 1) {
  205.          return var0[0].toExternalForm();
  206.       } else {
  207.          StringBuffer var1 = new StringBuffer(var0[0].toExternalForm());
  208.  
  209.          for(int var2 = 1; var2 < var0.length; ++var2) {
  210.             var1.append(' ');
  211.             var1.append(var0[var2].toExternalForm());
  212.          }
  213.  
  214.          return var1.toString();
  215.       }
  216.    }
  217.  
  218.    private static ClassLoader getRMIContextClassLoader() {
  219.       return Thread.currentThread().getContextClassLoader();
  220.    }
  221.  
  222.    private static Loader lookupLoader(URL[] var0, ClassLoader var1) {
  223.       Class var4 = class$sun$rmi$server$LoaderHandler == null ? (class$sun$rmi$server$LoaderHandler = class$("sun.rmi.server.LoaderHandler")) : class$sun$rmi$server$LoaderHandler;
  224.       synchronized(var4) {
  225.          LoaderEntry var2;
  226.          while((var2 = (LoaderEntry)refQueue.poll()) != null) {
  227.             if (!var2.removed) {
  228.                loaderTable.remove(var2.key);
  229.             }
  230.          }
  231.  
  232.          LoaderKey var5 = new LoaderKey(var0, var1);
  233.          var2 = (LoaderEntry)loaderTable.get(var5);
  234.          Loader var3;
  235.          if (var2 == null || (var3 = (Loader)((Reference)var2).get()) == null) {
  236.             if (var2 != null) {
  237.                loaderTable.remove(var5);
  238.                var2.removed = true;
  239.             }
  240.  
  241.             AccessControlContext var6 = getLoaderAccessControlContext(var0);
  242.             var3 = (Loader)AccessController.doPrivileged(new 1(var0, var1), var6);
  243.             var2 = new LoaderEntry(var5, var3);
  244.             loaderTable.put(var5, var2);
  245.          }
  246.  
  247.          return var3;
  248.       }
  249.    }
  250.  
  251.    private static AccessControlContext getLoaderAccessControlContext(URL[] var0) {
  252.       PermissionCollection var1 = (PermissionCollection)AccessController.doPrivileged(new 2());
  253.       var1.add(new RuntimePermission("createClassLoader"));
  254.       var1.add(new PropertyPermission("java.*", "read"));
  255.       addPermissionsForURLs(var0, var1, true);
  256.       ProtectionDomain var2 = new ProtectionDomain(new CodeSource(var0.length > 0 ? var0[0] : null, (Certificate[])null), var1);
  257.       return new AccessControlContext(new ProtectionDomain[]{var2});
  258.    }
  259.  
  260.    private static void addPermissionsForURLs(URL[] var0, PermissionCollection var1, boolean var2) {
  261.       for(int var3 = 0; var3 < var0.length; ++var3) {
  262.          URL var4 = var0[var3];
  263.  
  264.          try {
  265.             Permission var5 = var4.openConnection().getPermission();
  266.             if (var5 != null) {
  267.                if (var5 instanceof FilePermission) {
  268.                   String var6 = var5.getName();
  269.                   int var7 = var6.lastIndexOf(File.separatorChar);
  270.                   if (var7 != -1) {
  271.                      var6 = var6.substring(0, var7 + 1);
  272.                      if (var6.endsWith(File.separator)) {
  273.                         var6 = var6 + "-";
  274.                      }
  275.  
  276.                      var1.add(new FilePermission(var6, "read"));
  277.                   } else {
  278.                      var1.add(var5);
  279.                   }
  280.                } else {
  281.                   var1.add(var5);
  282.                   if (var2) {
  283.                      String var10 = var4.getHost();
  284.                      if (var10 != null) {
  285.                         var1.add(new SocketPermission(var10, "connect, accept"));
  286.                      }
  287.                   }
  288.                }
  289.             }
  290.          } catch (IOException var8) {
  291.          }
  292.       }
  293.  
  294.    }
  295.  
  296.    // $FF: synthetic method
  297.    static Class class$(String var0) {
  298.       try {
  299.          return Class.forName(var0);
  300.       } catch (ClassNotFoundException var2) {
  301.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  302.       }
  303.    }
  304.  
  305.    // $FF: synthetic method
  306.    static ReferenceQueue access$200() {
  307.       return refQueue;
  308.    }
  309.  
  310.    // $FF: synthetic method
  311.    static void access$300(URL[] var0, PermissionCollection var1, boolean var2) {
  312.       addPermissionsForURLs(var0, var1, var2);
  313.    }
  314.  
  315.    // $FF: synthetic method
  316.    static String access$400(URL[] var0) {
  317.       return urlsToPath(var0);
  318.    }
  319.  
  320.    static {
  321.       String var0 = (String)AccessController.doPrivileged(new GetPropertyAction("java.rmi.server.codebase"));
  322.       if (var0 != null && var0.trim().length() > 0) {
  323.          codebase = var0;
  324.       }
  325.  
  326.       codebaseURLs = null;
  327.       codebaseLoaders = Collections.synchronizedMap(new WeakHashMap(5));
  328.  
  329.       for(ClassLoader var1 = ClassLoader.getSystemClassLoader(); var1 != null; var1 = var1.getParent()) {
  330.          codebaseLoaders.put(var1, (Object)null);
  331.       }
  332.  
  333.       loaderTable = new HashMap(5);
  334.       refQueue = new ReferenceQueue();
  335.       pathToURLsCache = new WeakHashMap(5);
  336.    }
  337. }
  338.