IORInfoImpl.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2000, 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 26package com.sun.corba.se.impl.interceptors; 27 28import java.util.Iterator ; 29 30import org.omg.IOP.TaggedComponent; 31 32import org.omg.CORBA.BAD_INV_ORDER; 33import org.omg.CORBA.BAD_PARAM; 34import org.omg.CORBA.INTERNAL; 35import org.omg.CORBA.CompletionStatus; 36import org.omg.CORBA.INV_POLICY; 37import org.omg.CORBA.NO_IMPLEMENT; 38import org.omg.CORBA.Policy; 39import org.omg.CORBA.LocalObject; 40 41import org.omg.PortableInterceptor.IORInfo; 42import org.omg.PortableInterceptor.ObjectReferenceTemplate; 43import org.omg.PortableInterceptor.ObjectReferenceFactory; 44 45import com.sun.corba.se.spi.orb.ORB ; 46 47import com.sun.corba.se.spi.oa.ObjectAdapter; 48 49import com.sun.corba.se.spi.legacy.interceptor.IORInfoExt; 50import com.sun.corba.se.spi.legacy.interceptor.UnknownType; 51 52import com.sun.corba.se.spi.ior.IORTemplate; 53import com.sun.corba.se.spi.ior.TaggedProfileTemplate; 54import com.sun.corba.se.spi.ior.TaggedComponentFactoryFinder ; 55 56import com.sun.corba.se.spi.logging.CORBALogDomains ; 57 58import com.sun.corba.se.impl.logging.InterceptorsSystemException ; 59import com.sun.corba.se.impl.logging.OMGSystemException ; 60import com.sun.corba.se.impl.logging.ORBUtilSystemException ; 61 62/** 63 * IORInfoImpl is the implementation of the IORInfo class, as described 64 * in orbos/99-12-02, section 7. 65 */ 66public final class IORInfoImpl 67 extends LocalObject 68 implements IORInfo, IORInfoExt 69{ 70 // State values that determine which methods are allowed. 71 // get_effective_policy, manager_id, and adapter_state are valid unless STATE_DONE 72 73 // add_component, and add_component_to_profile are valid. 74 private static final int STATE_INITIAL = 0 ; 75 76 // adapter_template, and R/W to current_factory are valid 77 private static final int STATE_ESTABLISHED = 1 ; 78 79 // No methods are valid in this state 80 private static final int STATE_DONE = 2 ; 81 82 // The current state of this object 83 private int state = STATE_INITIAL ; 84 85 // The ObjectAdapter associated with this IORInfo object. 86 private ObjectAdapter adapter; 87 88 private ORB orb ; 89 90 private ORBUtilSystemException orbutilWrapper ; 91 private InterceptorsSystemException wrapper ; 92 private OMGSystemException omgWrapper ; 93 94 /** 95 * Creates a new IORInfo implementation. This info object will establish 96 * tagged components with the template for the provided IOR Template. 97 */ 98 IORInfoImpl( ObjectAdapter adapter ) { 99 this.orb = adapter.getORB() ; 100 101 orbutilWrapper = ORBUtilSystemException.get( orb, 102 CORBALogDomains.RPC_PROTOCOL ) ; 103 wrapper = InterceptorsSystemException.get( orb, 104 CORBALogDomains.RPC_PROTOCOL ) ; 105 omgWrapper = OMGSystemException.get( orb, 106 CORBALogDomains.RPC_PROTOCOL ) ; 107 108 this.adapter = adapter; 109 } 110 111 /** 112 * An ORB service implementation may determine what server side policy 113 * of a particular type is in effect for an IOR being constructed by 114 * calling the get_effective_policy operation. When the IOR being 115 * constructed is for an object implemented using a POA, all Policy 116 * objects passed to the PortableServer::POA::create_POA call that 117 * created that POA are accessible via get_effective_policy. 118 * <p> 119 * If a policy for the given type is not known to the ORB, then this 120 * operation will raise INV_POLICY with a standard minor code of 2. 121 * 122 * @param type The CORBA::PolicyType specifying the type of policy to 123 * return. 124 * @return The effective CORBA::Policy object of the requested type. 125 * If the given policy type is known, but no policy of that tpye is 126 * in effect, then this operation will return a nil object reference. 127 */ 128 public Policy get_effective_policy (int type) { 129 checkState( STATE_INITIAL, STATE_ESTABLISHED ) ; 130 131 return adapter.getEffectivePolicy( type ); 132 } 133 134 /** 135 * A portable ORB service implementation calls this method from its 136 * implementation of establish_components to add a tagged component to 137 * the set which will be included when constructing IORs. The 138 * components in this set will be included in all profiles. 139 * <p> 140 * Any number of components may exist with the same component ID. 141 * 142 * @param tagged_component The IOP::TaggedComponent to add 143 */ 144 public void add_ior_component (TaggedComponent tagged_component) { 145 checkState( STATE_INITIAL ) ; 146 147 if( tagged_component == null ) nullParam(); 148 addIORComponentToProfileInternal( tagged_component, 149 adapter.getIORTemplate().iterator()); 150 } 151 152 /** 153 * A portable ORB service implementation calls this method from its 154 * implementation of establish_components to add a tagged component to 155 * the set which will be included when constructing IORs. The 156 * components in this set will be included in the specified profile. 157 * <p> 158 * Any number of components may exist with the same component ID. 159 * <p> 160 * If the given profile ID does not define a known profile or it is 161 * impossible to add components to thgat profile, BAD_PARAM is raised 162 * with a minor code of TBD_BP + 3. 163 * 164 * @param tagged_component The IOP::TaggedComponent to add. 165 * @param profile_id The IOP::ProfileId tof the profile to which this 166 * component will be added. 167 */ 168 public void add_ior_component_to_profile ( 169 TaggedComponent tagged_component, int profile_id ) 170 { 171 checkState( STATE_INITIAL ) ; 172 173 if( tagged_component == null ) nullParam(); 174 addIORComponentToProfileInternal( 175 tagged_component, adapter.getIORTemplate().iteratorById( 176 profile_id ) ); 177 } 178 179 /** 180 * @param type The type of the server port 181 * (see connection.ORBSocketFactory for discussion). 182 * @return The listen port number for that type. 183 * @throws UnknownType if no port of the given type is found. 184 */ 185 public int getServerPort(String type) 186 throws UnknownType 187 { 188 checkState( STATE_INITIAL, STATE_ESTABLISHED ) ; 189 190 int port = 191 orb.getLegacyServerSocketManager() 192 .legacyGetTransientOrPersistentServerPort(type); 193 if (port == -1) { 194 throw new UnknownType(); 195 } 196 return port; 197 } 198 199 public ObjectAdapter getObjectAdapter() 200 { 201 return adapter; 202 } 203 204 public int manager_id() 205 { 206 checkState( STATE_INITIAL, STATE_ESTABLISHED) ; 207 208 return adapter.getManagerId() ; 209 } 210 211 public short state() 212 { 213 checkState( STATE_INITIAL, STATE_ESTABLISHED) ; 214 215 return adapter.getState() ; 216 } 217 218 public ObjectReferenceTemplate adapter_template() 219 { 220 checkState( STATE_ESTABLISHED) ; 221 222 // At this point, the iortemp must contain only a single 223 // IIOPProfileTemplate. This is a restriction of our 224 // implementation. Also, note the the ObjectReferenceTemplate 225 // is called when a certain POA is created in a certain ORB 226 // in a certain server, so the server_id, orb_id, and 227 // poa_id operations must be well-defined no matter what 228 // kind of implementation is used: e.g., if a POA creates 229 // IORs with multiple profiles, they must still all agree 230 // about this information. Thus, we are justified in 231 // extracting the single IIOPProfileTemplate to create 232 // an ObjectReferenceTemplate here. 233 234 return adapter.getAdapterTemplate() ; 235 } 236 237 public ObjectReferenceFactory current_factory() 238 { 239 checkState( STATE_ESTABLISHED) ; 240 241 return adapter.getCurrentFactory() ; 242 } 243 244 public void current_factory( ObjectReferenceFactory factory ) 245 { 246 checkState( STATE_ESTABLISHED) ; 247 248 adapter.setCurrentFactory( factory ) ; 249 } 250 251 /** 252 * Internal utility method to add an IOR component to the set of profiles 253 * present in the iterator. 254 */ 255 private void addIORComponentToProfileInternal( 256 TaggedComponent tagged_component, Iterator iterator ) 257 { 258 // Convert the given IOP::TaggedComponent into the appropriate 259 // type for the TaggedProfileTemplate 260 TaggedComponentFactoryFinder finder = 261 orb.getTaggedComponentFactoryFinder(); 262 Object newTaggedComponent = finder.create( orb, tagged_component ); 263 264 // Iterate through TaggedProfileTemplates and add the given tagged 265 // component to the appropriate one(s). 266 boolean found = false; 267 while( iterator.hasNext() ) { 268 found = true; 269 TaggedProfileTemplate taggedProfileTemplate = 270 (TaggedProfileTemplate)iterator.next(); 271 taggedProfileTemplate.add( newTaggedComponent ); 272 } 273 274 // If no profile was found with the given id, throw a BAD_PARAM: 275 // (See orbos/00-08-06, section 21.5.3.3.) 276 if( !found ) { 277 throw omgWrapper.invalidProfileId() ; 278 } 279 } 280 281 /** 282 * Called when an invalid null parameter was passed. Throws a 283 * BAD_PARAM with a minor code of 1 284 */ 285 private void nullParam() 286 { 287 throw orbutilWrapper.nullParam() ; 288 } 289 290 // REVISIT: add minor codes! 291 292 private void checkState( int expectedState ) 293 { 294 if (expectedState != state) 295 throw wrapper.badState1( new Integer(expectedState), new Integer(state) ) ; 296 } 297 298 private void checkState( int expectedState1, int expectedState2 ) 299 { 300 if ((expectedState1 != state) && (expectedState2 != state)) 301 throw wrapper.badState2( new Integer(expectedState1), 302 new Integer(expectedState2), new Integer(state) ) ; 303 } 304 305 void makeStateEstablished() 306 { 307 checkState( STATE_INITIAL ) ; 308 309 state = STATE_ESTABLISHED ; 310 } 311 312 void makeStateDone() 313 { 314 checkState( STATE_ESTABLISHED ) ; 315 316 state = STATE_DONE ; 317 } 318} 319