1 /*
   2  * Copyright (c) 1995, 2004, 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 /*
  26  * Licensed Materials - Property of IBM
  27  * RMI-IIOP v1.0
  28  * Copyright IBM Corp. 1998 1999  All Rights Reserved
  29  *
  30  */
  31 
  32 package com.sun.corba.se.impl.util;
  33 
  34 import java.rmi.Remote;
  35 import java.rmi.NoSuchObjectException;
  36 import java.rmi.server.RMIClassLoader;
  37 import java.rmi.server.UnicastRemoteObject;
  38 import org.omg.CORBA.BAD_PARAM;
  39 import org.omg.CORBA.CompletionStatus;
  40 import java.util.Properties;
  41 import java.io.File;
  42 import java.io.FileInputStream;
  43 import java.security.AccessController;
  44 import java.security.PrivilegedAction;
  45 import java.net.MalformedURLException;
  46 import com.sun.corba.se.impl.orbutil.GetPropertyAction;
  47 
  48 /**
  49  *  Utility methods for doing various method calls which are used
  50  *  by multiple classes
  51  */
  52 public class JDKBridge {
  53 
  54     /**
  55      * Get local codebase System property (java.rmi.server.codebase).
  56      * May be null or a space separated array of URLS.
  57      */
  58     public static String getLocalCodebase () {
  59         return localCodebase;
  60     }
  61 
  62     /**
  63      * Return true if the system property "java.rmi.server.useCodebaseOnly"
  64      * is set, false otherwise.
  65      */
  66     public static boolean useCodebaseOnly () {
  67         return useCodebaseOnly;
  68     }
  69 
  70     /**
  71      * Returns a class instance for the specified class.
  72      * @param className the name of the class
  73      * @param remoteCodebase a space-separated array of urls at which
  74      * the class might be found. May be null.
  75      * @param loader a ClassLoader who may be used to
  76      * load the class if all other methods fail.
  77      * @return the <code>Class</code> object representing the loaded class.
  78      * @exception throws ClassNotFoundException if class cannot be loaded.
  79      */
  80     public static Class loadClass (String className,
  81                                    String remoteCodebase,
  82                                    ClassLoader loader)
  83         throws ClassNotFoundException {
  84 
  85         if (loader == null) {
  86             return loadClassM(className,remoteCodebase,useCodebaseOnly);
  87         } else {
  88             try {
  89                 return loadClassM(className,remoteCodebase,useCodebaseOnly);
  90             } catch (ClassNotFoundException e) {
  91                 return loader.loadClass(className);
  92             }
  93         }
  94     }
  95 
  96     /**
  97      * Returns a class instance for the specified class.
  98      * @param className the name of the class
  99      * @param remoteCodebase a space-separated array of urls at which
 100      * the class might be found. May be null.
 101      * @return the <code>Class</code> object representing the loaded class.
 102      * @exception throws ClassNotFoundException if class cannot be loaded.
 103      */
 104     public static Class loadClass (String className,
 105                                    String remoteCodebase)
 106         throws ClassNotFoundException {
 107         return loadClass(className,remoteCodebase,null);
 108     }
 109 
 110     /**
 111      * Returns a class instance for the specified class.
 112      * @param className the name of the class
 113      * @return the <code>Class</code> object representing the loaded class.
 114      * @exception throws ClassNotFoundException if class cannot be loaded.
 115      */
 116     public static Class loadClass (String className)
 117         throws ClassNotFoundException {
 118         return loadClass(className,null,null);
 119     }
 120 
 121     private static final String LOCAL_CODEBASE_KEY = "java.rmi.server.codebase";
 122     private static final String USE_CODEBASE_ONLY_KEY = "java.rmi.server.useCodebaseOnly";
 123     private static String localCodebase = null;
 124     private static boolean useCodebaseOnly;
 125 
 126     static {
 127         setCodebaseProperties();
 128     }
 129 
 130     public static final void main (String[] args) {
 131         System.out.println("1.2 VM");
 132 
 133         /*
 134                  // If on 1.2, use a policy with all permissions.
 135                  System.setSecurityManager (new javax.rmi.download.SecurityManager());
 136                  String targetClass = "[[Lrmic.Typedef;";
 137                  System.out.println("localCodebase =  "+localCodebase);
 138                  System.out.println("Trying to load "+targetClass);
 139                  try {
 140                  Class clz = loadClass(targetClass,null,localCodebase);
 141                  System.out.println("Loaded: "+clz);
 142                  } catch (ClassNotFoundException e) {
 143                  System.out.println("Caught "+e);
 144                  }
 145         */
 146     }
 147 
 148     /**
 149      * Set the codebase and useCodebaseOnly properties. This is public
 150      * only for test code.
 151      */
 152     public static synchronized void setCodebaseProperties () {
 153         String prop = (String)AccessController.doPrivileged(
 154             new GetPropertyAction(LOCAL_CODEBASE_KEY)
 155         );
 156         if (prop != null && prop.trim().length() > 0) {
 157             localCodebase = prop;
 158         }
 159 
 160         prop = (String)AccessController.doPrivileged(
 161             new GetPropertyAction(USE_CODEBASE_ONLY_KEY)
 162         );
 163         if (prop != null && prop.trim().length() > 0) {
 164             useCodebaseOnly = Boolean.valueOf(prop).booleanValue();
 165         }
 166     }
 167 
 168     /**
 169      * Set the default code base. This method is here only
 170      * for test code.
 171      */
 172     public static synchronized void setLocalCodebase(String codebase) {
 173         localCodebase = codebase;
 174     }
 175 
 176     private static Class loadClassM (String className,
 177                             String remoteCodebase,
 178                             boolean useCodebaseOnly)
 179         throws ClassNotFoundException {
 180 
 181         try {
 182             return JDKClassLoader.loadClass(null,className);
 183         } catch (ClassNotFoundException e) {}
 184         try {
 185             if (!useCodebaseOnly && remoteCodebase != null) {
 186                 return RMIClassLoader.loadClass(remoteCodebase,
 187                                                 className);
 188             } else {
 189                 return RMIClassLoader.loadClass(className);
 190             }
 191         } catch (MalformedURLException e) {
 192             className = className + ": " + e.toString();
 193         }
 194 
 195         throw new ClassNotFoundException(className);
 196     }
 197 }