/* * 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 com.sun.corba.se.spi.orb.ORB; import org.omg.PortableInterceptor.Current; import org.omg.PortableInterceptor.InvalidSlot; import org.omg.CORBA.Any; import org.omg.CORBA.BAD_INV_ORDER; import org.omg.CORBA.CompletionStatus; import com.sun.corba.se.spi.logging.CORBALogDomains ; import com.sun.corba.se.impl.logging.OMGSystemException ; /** * PICurrent is the implementation of Current as specified in the Portable * Interceptors Spec orbos/99-12-02. * IMPORTANT: PICurrent is implemented with the assumption that get_slot() * or set_slot() will not be called in ORBInitializer.pre_init() and * post_init(). */ public class PICurrent extends org.omg.CORBA.LocalObject implements Current { // slotCounter is used to keep track of ORBInitInfo.allocate_slot_id() private int slotCounter; // The ORB associated with this PICurrent object. private ORB myORB; private OMGSystemException wrapper ; // True if the orb is still initialzing and get_slot and set_slot are not // to be called. private boolean orbInitializing; // ThreadLocal contains a stack of SlotTable which are used // for resolve_initial_references( "PICurrent" ); private ThreadLocal threadLocalSlotTable = new ThreadLocal( ) { protected Object initialValue( ) { SlotTable table = new SlotTable( myORB, slotCounter ); return new SlotTableStack( myORB, table ); } }; /** * PICurrent constructor which will be called for every ORB * initialization. */ PICurrent( ORB myORB ) { this.myORB = myORB; wrapper = OMGSystemException.get( myORB, CORBALogDomains.RPC_PROTOCOL ) ; this.orbInitializing = true; slotCounter = 0; } /** * This method will be called from ORBInitInfo.allocate_slot_id( ). * simply returns a slot id by incrementing slotCounter. */ int allocateSlotId( ) { int slotId = slotCounter; slotCounter = slotCounter + 1; return slotId; } /** * This method gets the SlotTable which is on the top of the * ThreadLocalStack. */ SlotTable getSlotTable( ) { SlotTable table = (SlotTable) ((SlotTableStack)threadLocalSlotTable.get()).peekSlotTable(); return table; } /** * This method pushes a SlotTable on the SlotTableStack. When there is * a resolve_initial_references("PICurrent") after this call. The new * PICurrent will be returned. */ void pushSlotTable( ) { SlotTableStack st = (SlotTableStack)threadLocalSlotTable.get(); st.pushSlotTable( ); } /** * This method pops a SlotTable on the SlotTableStack. */ void popSlotTable( ) { SlotTableStack st = (SlotTableStack)threadLocalSlotTable.get(); st.popSlotTable( ); } /** * This method sets the slot data at the given slot id (index) in the * Slot Table which is on the top of the SlotTableStack. */ public void set_slot( int id, Any data ) throws InvalidSlot { if( orbInitializing ) { // As per ptc/00-08-06 if the ORB is still initializing, disallow // calls to get_slot and set_slot. If an attempt is made to call, // throw a BAD_INV_ORDER. throw wrapper.invalidPiCall3() ; } getSlotTable().set_slot( id, data ); } /** * This method gets the slot data at the given slot id (index) from the * Slot Table which is on the top of the SlotTableStack. */ public Any get_slot( int id ) throws InvalidSlot { if( orbInitializing ) { // As per ptc/00-08-06 if the ORB is still initializing, disallow // calls to get_slot and set_slot. If an attempt is made to call, // throw a BAD_INV_ORDER. throw wrapper.invalidPiCall4() ; } return getSlotTable().get_slot( id ); } /** * This method resets all the slot data to null in the * Slot Table which is on the top of SlotTableStack. */ void resetSlotTable( ) { getSlotTable().resetSlots(); } /** * Called from ORB when the ORBInitializers are about to start * initializing. */ void setORBInitializing( boolean init ) { this.orbInitializing = init; } }