1 /*
   2  * Copyright (c) 2003, 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 package com.sun.corba.se.spi.presentation.rmi ;
  27 
  28 import java.util.Map ;
  29 
  30 import java.lang.reflect.Method ;
  31 import java.lang.reflect.InvocationHandler ;
  32 
  33 import javax.rmi.CORBA.Tie ;
  34 
  35 import com.sun.corba.se.spi.orb.ORB ;
  36 import com.sun.corba.se.spi.orbutil.proxy.InvocationHandlerFactory ;
  37 
  38 
  39 /** Provides access to RMI-IIOP stubs and ties.
  40  * Any style of stub and tie generation may be used.
  41  * This includes compiler generated stubs and runtime generated stubs
  42  * as well as compiled and reflective ties.  There is normally
  43  * only one instance of this interface per VM.  The instance
  44  * is obtained from the static method
  45  * com.sun.corba.se.spi.orb.ORB.getPresentationManager.
  46  * <p>
  47  * Note that
  48  * the getClassData and getDynamicMethodMarshaller methods
  49  * maintain caches to avoid redundant computation.
  50  */
  51 public interface PresentationManager
  52 {
  53     /** Creates StubFactory and Tie instances.
  54      */
  55     public interface StubFactoryFactory
  56     {
  57         /** Return the standard name of a stub (according to the RMI-IIOP specification
  58          * and rmic).  This is needed so that the name of a stub is known for
  59          * standalone clients of the app server.
  60          */
  61         String getStubName( String className ) ;
  62 
  63         /** Create a stub factory for stubs for the interface whose type is given by
  64          * className.  className may identify either an IDL interface or an RMI-IIOP
  65          * interface.
  66          * @param className The name of the remote interface as a Java class name.
  67          * @param isIDLStub True if className identifies an IDL stub, else false.
  68          * @param remoteCodeBase The CodeBase to use for loading Stub classes, if
  69          * necessary (may be null or unused).
  70          * @param expectedClass The expected stub type (may be null or unused).
  71          * @param classLoader The classLoader to use (may be null).
  72          */
  73         PresentationManager.StubFactory createStubFactory( String className,
  74             boolean isIDLStub, String remoteCodeBase, Class expectedClass,
  75             ClassLoader classLoader);
  76 
  77         /** Return a Tie for the given class.
  78          */
  79         Tie getTie( Class cls ) ;
  80 
  81         /** Return whether or not this StubFactoryFactory creates StubFactory
  82          * instances that create dynamic stubs and ties.  At the top level,
  83          * true indicates that rmic -iiop is not needed for generating stubs
  84          * or ties.
  85          */
  86         boolean createsDynamicStubs() ;
  87     }
  88 
  89     /** Creates the actual stub needed for RMI-IIOP remote
  90      * references.
  91      */
  92     public interface StubFactory
  93     {
  94         /** Create a new dynamic stub.  It has the type that was
  95          * used to create this factory.
  96          */
  97         org.omg.CORBA.Object makeStub() ;
  98 
  99         /** Return the repository ID information for all Stubs
 100          * created by this stub factory.
 101          */
 102         String[] getTypeIds() ;
 103     }
 104 
 105     public interface ClassData
 106     {
 107         /** Get the class used to create this ClassData instance
 108          */
 109         Class getMyClass() ;
 110 
 111         /** Get the IDLNameTranslator for the class used to create
 112          * this ClassData instance.
 113          */
 114         IDLNameTranslator getIDLNameTranslator() ;
 115 
 116         /** Return the array of repository IDs for all of the remote
 117          * interfaces implemented by this class.
 118          */
 119         String[] getTypeIds() ;
 120 
 121         /** Get the InvocationHandlerFactory that is used to create
 122          * an InvocationHandler for dynamic stubs of the type of the
 123          * ClassData.
 124          */
 125         InvocationHandlerFactory getInvocationHandlerFactory() ;
 126 
 127         /** Get the dictionary for this ClassData instance.
 128          * This is used to hold class-specific information for a Class
 129          * in the class data.  This avoids the need to create other
 130          * caches for accessing the information.
 131          */
 132         Map getDictionary() ;
 133     }
 134 
 135     /** Get the ClassData for a particular class.
 136      * This class may be an implementation class, in which
 137      * case the IDLNameTranslator handles all Remote interfaces implemented by
 138      * the class.  If the class implements more than one remote interface, and not
 139      * all of the remote interfaces are related by inheritance, then the type
 140      * IDs have the implementation class as element 0.
 141      */
 142     ClassData getClassData( Class cls ) ;
 143 
 144     /** Given a particular method, return a DynamicMethodMarshaller
 145      * for that method.  This is used for dynamic stubs and ties.
 146      */
 147     DynamicMethodMarshaller getDynamicMethodMarshaller( Method method ) ;
 148 
 149     /** Return the registered StubFactoryFactory.
 150      */
 151     StubFactoryFactory getStubFactoryFactory( boolean isDynamic ) ;
 152 
 153     /** Register the StubFactoryFactory.  Note that
 154      * a static StubFactoryFactory is always required for IDL.  The
 155      * dynamic stubFactoryFactory is optional.
 156      */
 157     void setStubFactoryFactory( boolean isDynamic, StubFactoryFactory sff ) ;
 158 
 159     /** Equivalent to getStubFactoryFactory( true ).getTie( null ).
 160      * Provided for compatibility with earlier versions of PresentationManager
 161      * as used in the app server.  The class argument is ignored in
 162      * the dynamic case, so this is safe.
 163      */
 164     Tie getTie() ;
 165 
 166     /** Returns the value of the com.sun.CORBA.ORBUseDynamicStub
 167      * property.
 168      */
 169     boolean useDynamicStubs() ;
 170 }