/* * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.corba.se.impl.interceptors; import java.util.Iterator ; import org.omg.IOP.TaggedComponent; import org.omg.CORBA.BAD_INV_ORDER; import org.omg.CORBA.BAD_PARAM; import org.omg.CORBA.INTERNAL; import org.omg.CORBA.CompletionStatus; import org.omg.CORBA.INV_POLICY; import org.omg.CORBA.NO_IMPLEMENT; import org.omg.CORBA.Policy; import org.omg.CORBA.LocalObject; import org.omg.PortableInterceptor.IORInfo; import org.omg.PortableInterceptor.ObjectReferenceTemplate; import org.omg.PortableInterceptor.ObjectReferenceFactory; import com.sun.corba.se.spi.orb.ORB ; import com.sun.corba.se.spi.oa.ObjectAdapter; import com.sun.corba.se.spi.legacy.interceptor.IORInfoExt; import com.sun.corba.se.spi.legacy.interceptor.UnknownType; import com.sun.corba.se.spi.ior.IORTemplate; import com.sun.corba.se.spi.ior.TaggedProfileTemplate; import com.sun.corba.se.spi.ior.TaggedComponentFactoryFinder ; import com.sun.corba.se.spi.logging.CORBALogDomains ; import com.sun.corba.se.impl.logging.InterceptorsSystemException ; import com.sun.corba.se.impl.logging.OMGSystemException ; import com.sun.corba.se.impl.logging.ORBUtilSystemException ; /** * IORInfoImpl is the implementation of the IORInfo class, as described * in orbos/99-12-02, section 7. */ public final class IORInfoImpl extends LocalObject implements IORInfo, IORInfoExt { // State values that determine which methods are allowed. // get_effective_policy, manager_id, and adapter_state are valid unless STATE_DONE // add_component, and add_component_to_profile are valid. private static final int STATE_INITIAL = 0 ; // adapter_template, and R/W to current_factory are valid private static final int STATE_ESTABLISHED = 1 ; // No methods are valid in this state private static final int STATE_DONE = 2 ; // The current state of this object private int state = STATE_INITIAL ; // The ObjectAdapter associated with this IORInfo object. private ObjectAdapter adapter; private ORB orb ; private ORBUtilSystemException orbutilWrapper ; private InterceptorsSystemException wrapper ; private OMGSystemException omgWrapper ; /** * Creates a new IORInfo implementation. This info object will establish * tagged components with the template for the provided IOR Template. */ IORInfoImpl( ObjectAdapter adapter ) { this.orb = adapter.getORB() ; orbutilWrapper = ORBUtilSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; wrapper = InterceptorsSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; omgWrapper = OMGSystemException.get( orb, CORBALogDomains.RPC_PROTOCOL ) ; this.adapter = adapter; } /** * An ORB service implementation may determine what server side policy * of a particular type is in effect for an IOR being constructed by * calling the get_effective_policy operation. When the IOR being * constructed is for an object implemented using a POA, all Policy * objects passed to the PortableServer::POA::create_POA call that * created that POA are accessible via get_effective_policy. * <p> * If a policy for the given type is not known to the ORB, then this * operation will raise INV_POLICY with a standard minor code of 2. * * @param type The CORBA::PolicyType specifying the type of policy to * return. * @return The effective CORBA::Policy object of the requested type. * If the given policy type is known, but no policy of that tpye is * in effect, then this operation will return a nil object reference. */ public Policy get_effective_policy (int type) { checkState( STATE_INITIAL, STATE_ESTABLISHED ) ; return adapter.getEffectivePolicy( type ); } /** * A portable ORB service implementation calls this method from its * implementation of establish_components to add a tagged component to * the set which will be included when constructing IORs. The * components in this set will be included in all profiles. * <p> * Any number of components may exist with the same component ID. * * @param tagged_component The IOP::TaggedComponent to add */ public void add_ior_component (TaggedComponent tagged_component) { checkState( STATE_INITIAL ) ; if( tagged_component == null ) nullParam(); addIORComponentToProfileInternal( tagged_component, adapter.getIORTemplate().iterator()); } /** * A portable ORB service implementation calls this method from its * implementation of establish_components to add a tagged component to * the set which will be included when constructing IORs. The * components in this set will be included in the specified profile. * <p> * Any number of components may exist with the same component ID. * <p> * If the given profile ID does not define a known profile or it is * impossible to add components to thgat profile, BAD_PARAM is raised * with a minor code of TBD_BP + 3. * * @param tagged_component The IOP::TaggedComponent to add. * @param profile_id The IOP::ProfileId tof the profile to which this * component will be added. */ public void add_ior_component_to_profile ( TaggedComponent tagged_component, int profile_id ) { checkState( STATE_INITIAL ) ; if( tagged_component == null ) nullParam(); addIORComponentToProfileInternal( tagged_component, adapter.getIORTemplate().iteratorById( profile_id ) ); } /** * @param type The type of the server port * (see connection.ORBSocketFactory for discussion). * @return The listen port number for that type. * @throws UnknownType if no port of the given type is found. */ public int getServerPort(String type) throws UnknownType { checkState( STATE_INITIAL, STATE_ESTABLISHED ) ; int port = orb.getLegacyServerSocketManager() .legacyGetTransientOrPersistentServerPort(type); if (port == -1) { throw new UnknownType(); } return port; } public ObjectAdapter getObjectAdapter() { return adapter; } public int manager_id() { checkState( STATE_INITIAL, STATE_ESTABLISHED) ; return adapter.getManagerId() ; } public short state() { checkState( STATE_INITIAL, STATE_ESTABLISHED) ; return adapter.getState() ; } public ObjectReferenceTemplate adapter_template() { checkState( STATE_ESTABLISHED) ; // At this point, the iortemp must contain only a single // IIOPProfileTemplate. This is a restriction of our // implementation. Also, note the the ObjectReferenceTemplate // is called when a certain POA is created in a certain ORB // in a certain server, so the server_id, orb_id, and // poa_id operations must be well-defined no matter what // kind of implementation is used: e.g., if a POA creates // IORs with multiple profiles, they must still all agree // about this information. Thus, we are justified in // extracting the single IIOPProfileTemplate to create // an ObjectReferenceTemplate here. return adapter.getAdapterTemplate() ; } public ObjectReferenceFactory current_factory() { checkState( STATE_ESTABLISHED) ; return adapter.getCurrentFactory() ; } public void current_factory( ObjectReferenceFactory factory ) { checkState( STATE_ESTABLISHED) ; adapter.setCurrentFactory( factory ) ; } /** * Internal utility method to add an IOR component to the set of profiles * present in the iterator. */ private void addIORComponentToProfileInternal( TaggedComponent tagged_component, Iterator iterator ) { // Convert the given IOP::TaggedComponent into the appropriate // type for the TaggedProfileTemplate TaggedComponentFactoryFinder finder = orb.getTaggedComponentFactoryFinder(); Object newTaggedComponent = finder.create( orb, tagged_component ); // Iterate through TaggedProfileTemplates and add the given tagged // component to the appropriate one(s). boolean found = false; while( iterator.hasNext() ) { found = true; TaggedProfileTemplate taggedProfileTemplate = (TaggedProfileTemplate)iterator.next(); taggedProfileTemplate.add( newTaggedComponent ); } // If no profile was found with the given id, throw a BAD_PARAM: // (See orbos/00-08-06, section 21.5.3.3.) if( !found ) { throw omgWrapper.invalidProfileId() ; } } /** * Called when an invalid null parameter was passed. Throws a * BAD_PARAM with a minor code of 1 */ private void nullParam() { throw orbutilWrapper.nullParam() ; } // REVISIT: add minor codes! private void checkState( int expectedState ) { if (expectedState != state) throw wrapper.badState1( new Integer(expectedState), new Integer(state) ) ; } private void checkState( int expectedState1, int expectedState2 ) { if ((expectedState1 != state) && (expectedState2 != state)) throw wrapper.badState2( new Integer(expectedState1), new Integer(expectedState2), new Integer(state) ) ; } void makeStateEstablished() { checkState( STATE_INITIAL ) ; state = STATE_ESTABLISHED ; } void makeStateDone() { checkState( STATE_ESTABLISHED ) ; state = STATE_DONE ; } }