PICurrent.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 com.sun.corba.se.spi.orb.ORB; 29import org.omg.PortableInterceptor.Current; 30import org.omg.PortableInterceptor.InvalidSlot; 31import org.omg.CORBA.Any; 32import org.omg.CORBA.BAD_INV_ORDER; 33import org.omg.CORBA.CompletionStatus; 34 35import com.sun.corba.se.spi.logging.CORBALogDomains ; 36import com.sun.corba.se.impl.logging.OMGSystemException ; 37 38/** 39 * PICurrent is the implementation of Current as specified in the Portable 40 * Interceptors Spec orbos/99-12-02. 41 * IMPORTANT: PICurrent is implemented with the assumption that get_slot() 42 * or set_slot() will not be called in ORBInitializer.pre_init() and 43 * post_init(). 44 */ 45public class PICurrent extends org.omg.CORBA.LocalObject 46 implements Current 47{ 48 // slotCounter is used to keep track of ORBInitInfo.allocate_slot_id() 49 private int slotCounter; 50 51 // The ORB associated with this PICurrent object. 52 private ORB myORB; 53 54 private OMGSystemException wrapper ; 55 56 // True if the orb is still initialzing and get_slot and set_slot are not 57 // to be called. 58 private boolean orbInitializing; 59 60 // ThreadLocal contains a stack of SlotTable which are used 61 // for resolve_initial_references( "PICurrent" ); 62 private ThreadLocal threadLocalSlotTable 63 = new ThreadLocal( ) { 64 protected Object initialValue( ) { 65 SlotTable table = new SlotTable( myORB, slotCounter ); 66 return new SlotTableStack( myORB, table ); 67 } 68 }; 69 70 /** 71 * PICurrent constructor which will be called for every ORB 72 * initialization. 73 */ 74 PICurrent( ORB myORB ) { 75 this.myORB = myORB; 76 wrapper = OMGSystemException.get( myORB, 77 CORBALogDomains.RPC_PROTOCOL ) ; 78 this.orbInitializing = true; 79 slotCounter = 0; 80 } 81 82 83 /** 84 * This method will be called from ORBInitInfo.allocate_slot_id( ). 85 * simply returns a slot id by incrementing slotCounter. 86 */ 87 int allocateSlotId( ) { 88 int slotId = slotCounter; 89 slotCounter = slotCounter + 1; 90 return slotId; 91 } 92 93 94 /** 95 * This method gets the SlotTable which is on the top of the 96 * ThreadLocalStack. 97 */ 98 SlotTable getSlotTable( ) { 99 SlotTable table = (SlotTable) 100 ((SlotTableStack)threadLocalSlotTable.get()).peekSlotTable(); 101 return table; 102 } 103 104 /** 105 * This method pushes a SlotTable on the SlotTableStack. When there is 106 * a resolve_initial_references("PICurrent") after this call. The new 107 * PICurrent will be returned. 108 */ 109 void pushSlotTable( ) { 110 SlotTableStack st = (SlotTableStack)threadLocalSlotTable.get(); 111 st.pushSlotTable( ); 112 } 113 114 115 /** 116 * This method pops a SlotTable on the SlotTableStack. 117 */ 118 void popSlotTable( ) { 119 SlotTableStack st = (SlotTableStack)threadLocalSlotTable.get(); 120 st.popSlotTable( ); 121 } 122 123 /** 124 * This method sets the slot data at the given slot id (index) in the 125 * Slot Table which is on the top of the SlotTableStack. 126 */ 127 public void set_slot( int id, Any data ) throws InvalidSlot 128 { 129 if( orbInitializing ) { 130 // As per ptc/00-08-06 if the ORB is still initializing, disallow 131 // calls to get_slot and set_slot. If an attempt is made to call, 132 // throw a BAD_INV_ORDER. 133 throw wrapper.invalidPiCall3() ; 134 } 135 136 getSlotTable().set_slot( id, data ); 137 } 138 139 /** 140 * This method gets the slot data at the given slot id (index) from the 141 * Slot Table which is on the top of the SlotTableStack. 142 */ 143 public Any get_slot( int id ) throws InvalidSlot 144 { 145 if( orbInitializing ) { 146 // As per ptc/00-08-06 if the ORB is still initializing, disallow 147 // calls to get_slot and set_slot. If an attempt is made to call, 148 // throw a BAD_INV_ORDER. 149 throw wrapper.invalidPiCall4() ; 150 } 151 152 return getSlotTable().get_slot( id ); 153 } 154 155 /** 156 * This method resets all the slot data to null in the 157 * Slot Table which is on the top of SlotTableStack. 158 */ 159 void resetSlotTable( ) { 160 getSlotTable().resetSlots(); 161 } 162 163 /** 164 * Called from ORB when the ORBInitializers are about to start 165 * initializing. 166 */ 167 void setORBInitializing( boolean init ) { 168 this.orbInitializing = init; 169 } 170} 171