1 /*
2  * Copyright (c) 2001, 2003, 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 package com.sun.corba.se.spi.oa ;
26 
27 import org.omg.PortableInterceptor.ObjectReferenceTemplate ;
28 import org.omg.PortableInterceptor.ObjectReferenceFactory ;
29 
30 import org.omg.CORBA.Policy ;
31 
32 import org.omg.PortableInterceptor.ACTIVE ;
33 
34 import com.sun.corba.se.spi.copyobject.ObjectCopierFactory ;
35 import com.sun.corba.se.spi.ior.IORFactories ;
36 import com.sun.corba.se.spi.ior.IORTemplate ;
37 import com.sun.corba.se.spi.ior.ObjectAdapterId;
38 import com.sun.corba.se.spi.ior.ObjectKeyTemplate ;
39 import com.sun.corba.se.spi.logging.CORBALogDomains ;
40 import com.sun.corba.se.spi.oa.OADestroyed ;
41 import com.sun.corba.se.spi.oa.ObjectAdapter ;
42 import com.sun.corba.se.spi.orb.ORB ;
43 import com.sun.corba.se.spi.protocol.PIHandler ;
44 
45 import com.sun.corba.se.impl.logging.POASystemException ;
46 import com.sun.corba.se.impl.logging.OMGSystemException ;
47 import com.sun.corba.se.impl.oa.poa.Policies;
48 
49 abstract public class ObjectAdapterBase extends org.omg.CORBA.LocalObject
50     implements ObjectAdapter
51 {
52     private ORB orb;
53 
54     // Exception wrappers
55     private final POASystemException _iorWrapper ;
56     private final POASystemException _invocationWrapper ;
57     private final POASystemException _lifecycleWrapper ;
58     private final OMGSystemException _omgInvocationWrapper ;
59     private final OMGSystemException _omgLifecycleWrapper ;
60 
61     // Data related to the construction of object references and
62     // supporting the Object Reference Template.
63     private IORTemplate iortemp;
64     private byte[] adapterId ;
65     private ObjectReferenceTemplate adapterTemplate ;
66     private ObjectReferenceFactory currentFactory ;
67 
ObjectAdapterBase( ORB orb )68     public ObjectAdapterBase( ORB orb )
69     {
70         this.orb = orb ;
71         _iorWrapper = POASystemException.get( orb,
72             CORBALogDomains.OA_IOR ) ;
73         _lifecycleWrapper = POASystemException.get( orb,
74             CORBALogDomains.OA_LIFECYCLE ) ;
75         _omgLifecycleWrapper = OMGSystemException.get( orb,
76             CORBALogDomains.OA_LIFECYCLE ) ;
77         _invocationWrapper = POASystemException.get( orb,
78             CORBALogDomains.OA_INVOCATION ) ;
79         _omgInvocationWrapper = OMGSystemException.get( orb,
80             CORBALogDomains.OA_INVOCATION ) ;
81     }
82 
iorWrapper()83     public final POASystemException iorWrapper()
84     {
85         return _iorWrapper ;
86     }
87 
lifecycleWrapper()88     public final POASystemException lifecycleWrapper()
89     {
90         return _lifecycleWrapper ;
91     }
92 
omgLifecycleWrapper()93     public final OMGSystemException omgLifecycleWrapper()
94     {
95         return _omgLifecycleWrapper ;
96     }
97 
invocationWrapper()98     public final POASystemException invocationWrapper()
99     {
100         return _invocationWrapper ;
101     }
102 
omgInvocationWrapper()103     public final OMGSystemException omgInvocationWrapper()
104     {
105         return _omgInvocationWrapper ;
106     }
107 
108     /*
109      * This creates the complete template.
110      * When it is done, reference creation can proceed.
111      */
initializeTemplate( ObjectKeyTemplate oktemp, boolean notifyORB, Policies policies, String codebase, String objectAdapterManagerId, ObjectAdapterId objectAdapterId)112     final public void initializeTemplate( ObjectKeyTemplate oktemp,
113         boolean notifyORB, Policies policies, String codebase,
114         String objectAdapterManagerId, ObjectAdapterId objectAdapterId)
115     {
116         adapterId = oktemp.getAdapterId() ;
117 
118         iortemp = IORFactories.makeIORTemplate(oktemp) ;
119 
120         // This calls acceptors which create profiles and may
121         // add tagged components to those profiles.
122         orb.getCorbaTransportManager().addToIORTemplate(
123             iortemp, policies,
124             codebase, objectAdapterManagerId, objectAdapterId);
125 
126         adapterTemplate = IORFactories.makeObjectReferenceTemplate( orb,
127             iortemp ) ;
128         currentFactory = adapterTemplate ;
129 
130         if (notifyORB) {
131             PIHandler pih = orb.getPIHandler() ;
132             if (pih != null)
133                 // This runs the IORInterceptors.
134                 pih.objectAdapterCreated( this ) ;
135         }
136 
137         iortemp.makeImmutable() ;
138     }
139 
makeObject( String repId, byte[] oid )140     final public org.omg.CORBA.Object makeObject( String repId, byte[] oid )
141     {
142         return currentFactory.make_object( repId, oid ) ;
143     }
144 
getAdapterId()145     final public byte[] getAdapterId()
146     {
147         return adapterId ;
148     }
149 
getORB()150     final public ORB getORB()
151     {
152         return orb ;
153     }
154 
getEffectivePolicy( int type )155     abstract public Policy getEffectivePolicy( int type ) ;
156 
getIORTemplate()157     final public IORTemplate getIORTemplate()
158     {
159         return iortemp ;
160     }
161 
getManagerId()162     abstract public int getManagerId() ;
163 
getState()164     abstract public short getState() ;
165 
getAdapterTemplate()166     final public ObjectReferenceTemplate getAdapterTemplate()
167     {
168         return adapterTemplate ;
169     }
170 
getCurrentFactory()171     final public ObjectReferenceFactory getCurrentFactory()
172     {
173         return currentFactory ;
174     }
175 
setCurrentFactory( ObjectReferenceFactory factory )176     final public void setCurrentFactory( ObjectReferenceFactory factory )
177     {
178         currentFactory = factory ;
179     }
180 
getLocalServant( byte[] objectId )181     abstract public org.omg.CORBA.Object getLocalServant( byte[] objectId ) ;
182 
getInvocationServant( OAInvocationInfo info )183     abstract public void getInvocationServant( OAInvocationInfo info ) ;
184 
returnServant()185     abstract public void returnServant() ;
186 
enter()187     abstract public void enter() throws OADestroyed ;
188 
exit()189     abstract public void exit() ;
190 
getObjectCopierFactory()191     abstract protected ObjectCopierFactory getObjectCopierFactory() ;
192 
193     // Note that all current subclasses share the same implementation of this method,
194     // but overriding it would make sense for OAs that use a different InvocationInfo.
makeInvocationInfo( byte[] objectId )195     public OAInvocationInfo makeInvocationInfo( byte[] objectId )
196     {
197         OAInvocationInfo info = new OAInvocationInfo( this, objectId ) ;
198         info.setCopierFactory( getObjectCopierFactory() ) ;
199         return info ;
200     }
201 
getInterfaces( Object servant, byte[] objectId )202     abstract public String[] getInterfaces( Object servant, byte[] objectId ) ;
203 }
204