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 26 package com.sun.corba.se.spi.extension ; 27 28 import org.omg.CORBA.Policy ; 29 import org.omg.CORBA.LocalObject ; 30 import com.sun.corba.se.impl.orbutil.ORBConstants ; 31 32 /** Policy used to implement servant caching optimization in the POA. 33 * Creating a POA with an instance pol of this policy where 34 * pol.getType() > NO_SERVANT_CACHING will cause the servant to be 35 * looked up in the POA and cached in the LocalClientRequestDispatcher when 36 * the ClientRequestDispatcher is colocated with the implementation of the 37 * objref. This greatly speeds up invocations at the cost of violating the 38 * POA semantics. In particular, every request to a particular objref 39 * must be handled by the same servant. Note that this is typically the 40 * case for EJB implementations. 41 * <p> 42 * If servant caching is used, there are two different additional 43 * features of the POA that are expensive: 44 * <ol> 45 * <li>POA current semantics 46 * <li>Proper handling of POA destroy. 47 * </ol> 48 * POA current semantics requires maintaining a ThreadLocal stack of 49 * invocation information that is always available for POACurrent operations. 50 * Maintaining this stack is expensive on the timescale of optimized co-located 51 * calls, so the option is provided to turn it off. Similarly, causing 52 * POA.destroy() calls to wait for all active calls in the POA to complete 53 * requires careful tracking of the entry and exit of invocations in the POA. 54 * Again, tracking this is somewhat expensive. 55 */ 56 public class ServantCachingPolicy extends LocalObject implements Policy 57 { 58 /** Do not cache servants in the ClientRequestDispatcher. This will 59 * always support the full POA semantics, including changing the 60 * servant that handles requests on a particular objref. 61 */ 62 public static final int NO_SERVANT_CACHING = 0 ; 63 64 /** Perform servant caching, preserving POA current and POA destroy semantics. 65 * We will use this as the new default, as the app server is making heavier use 66 * now of POA facilities. 67 */ 68 public static final int FULL_SEMANTICS = 1 ; 69 70 /** Perform servant caching, preservent only POA current semantics. 71 * At least this level is required in order to support selection of ObjectCopiers 72 * for co-located RMI-IIOP calls, as the current copier is stored in 73 * OAInvocationInfo, which must be present on the stack inside the call. 74 */ 75 public static final int INFO_ONLY_SEMANTICS = 2 ; 76 77 /** Perform servant caching, not preserving POA current or POA destroy semantics. 78 */ 79 public static final int MINIMAL_SEMANTICS = 3 ; 80 81 private static ServantCachingPolicy policy = null ; 82 private static ServantCachingPolicy infoOnlyPolicy = null ; 83 private static ServantCachingPolicy minimalPolicy = null ; 84 85 private int type ; 86 87 public String typeToName() 88 { 89 switch (type) { 90 case FULL_SEMANTICS: 91 return "FULL" ; 92 case INFO_ONLY_SEMANTICS: 93 return "INFO_ONLY" ; 94 case MINIMAL_SEMANTICS: 95 return "MINIMAL" ; 96 default: 97 return "UNKNOWN(" + type + ")" ; 98 } 99 } 100 101 public String toString() 102 { 103 return "ServantCachingPolicy[" + typeToName() + "]" ; 104 } 105 106 private ServantCachingPolicy( int type ) 107 { 108 this.type = type ; 109 } 110 111 public int getType() 112 { 113 return type ; 114 } 115 116 /** Return the default servant caching policy. 117 */ 118 public synchronized static ServantCachingPolicy getPolicy() 119 { 120 return getFullPolicy() ; 121 } 122 123 public synchronized static ServantCachingPolicy getFullPolicy() 124 { 125 if (policy == null) 126 policy = new ServantCachingPolicy( FULL_SEMANTICS ) ; 127 128 return policy ; 129 } 130 131 public synchronized static ServantCachingPolicy getInfoOnlyPolicy() 132 { 133 if (infoOnlyPolicy == null) 134 infoOnlyPolicy = new ServantCachingPolicy( INFO_ONLY_SEMANTICS ) ; 135 136 return infoOnlyPolicy ; 137 } 138 139 public synchronized static ServantCachingPolicy getMinimalPolicy() 140 { 141 if (minimalPolicy == null) 142 minimalPolicy = new ServantCachingPolicy( MINIMAL_SEMANTICS ) ; 143 144 return minimalPolicy ; 145 } 146 147 public int policy_type () 148 { 149 return ORBConstants.SERVANT_CACHING_POLICY ; 150 } 151 152 public org.omg.CORBA.Policy copy () 153 { 154 return this ; 155 } 156 157 public void destroy () 158 { 159 // NO-OP 160 } 161 }