/*
* Copyright (c) 2001, 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 org.jboss.com.sun.corba.se.spi.extension;
import org.jboss.com.sun.corba.se.impl.orbutil.ORBConstants;
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.Policy;
/**
* Policy used to implement servant caching optimization in the POA. Creating a POA with an instance pol of this policy
* where pol.getType() > NO_SERVANT_CACHING will cause the servant to be looked up in the POA and cached in the
* LocalClientRequestDispatcher when the ClientRequestDispatcher is colocated with the implementation of the objref.
* This greatly speeds up invocations at the cost of violating the POA semantics. In particular, every request to a
* particular objref must be handled by the same servant. Note that this is typically the case for EJB implementations.
* <p>
* If servant caching is used, there are two different additional features of the POA that are expensive:
* <ol>
* <li>POA current semantics
* <li>Proper handling of POA destroy.
* <ol>
* POA current semantics requires maintaining a ThreadLocal stack of invocation information that is always available for
* POACurrent operations. Maintaining this stack is expensive on the timescale of optimized co-located calls, so the
* option is provided to turn it off. Similarly, causing POA.destroy() calls to wait for all active calls in the POA to
* complete requires careful tracking of the entry and exit of invocations in the POA. Again, tracking this is somewhat
* expensive.
*/
@SuppressWarnings("serial")
public class ServantCachingPolicy extends LocalObject implements Policy
{
/**
* Do not cache servants in the ClientRequestDispatcher. This will always support the full POA semantics, including
* changing the servant that handles requests on a particular objref.
*/
public static final int NO_SERVANT_CACHING = 0;
/**
* Perform servant caching, preserving POA current and POA destroy semantics. We will use this as the new default,
* as the app server is making heavier use now of POA facilities.
*/
public static final int FULL_SEMANTICS = 1;
/**
* Perform servant caching, preservent only POA current semantics. At least this level is required in order to
* support selection of ObjectCopiers for co-located RMI-IIOP calls, as the current copier is stored in
* OAInvocationInfo, which must be present on the stack inside the call.
*/
public static final int INFO_ONLY_SEMANTICS = 2;
/**
* Perform servant caching, not preserving POA current or POA destroy semantics.
*/
public static final int MINIMAL_SEMANTICS = 3;
private static ServantCachingPolicy policy = null;
private static ServantCachingPolicy infoOnlyPolicy = null;
private static ServantCachingPolicy minimalPolicy = null;
private int type;
public String typeToName()
{
switch (type)
{
case FULL_SEMANTICS :
return "FULL";
case INFO_ONLY_SEMANTICS :
return "INFO_ONLY";
case MINIMAL_SEMANTICS :
return "MINIMAL";
default :
return "UNKNOWN(" + type + ")";
}
}
public String toString()
{
return "ServantCachingPolicy[" + typeToName() + "]";
}
private ServantCachingPolicy(int type)
{
this.type = type;
}
public int getType()
{
return type;
}
/**
* Return the default servant caching policy.
*/
public synchronized static ServantCachingPolicy getPolicy()
{
return getFullPolicy();
}
public synchronized static ServantCachingPolicy getFullPolicy()
{
if (policy == null)
policy = new ServantCachingPolicy(FULL_SEMANTICS);
return policy;
}
public synchronized static ServantCachingPolicy getInfoOnlyPolicy()
{
if (infoOnlyPolicy == null)
infoOnlyPolicy = new ServantCachingPolicy(INFO_ONLY_SEMANTICS);
return infoOnlyPolicy;
}
public synchronized static ServantCachingPolicy getMinimalPolicy()
{
if (minimalPolicy == null)
minimalPolicy = new ServantCachingPolicy(MINIMAL_SEMANTICS);
return minimalPolicy;
}
public int policy_type()
{
return ORBConstants.SERVANT_CACHING_POLICY;
}
public org.omg.CORBA.Policy copy()
{
return this;
}
public void destroy()
{
// NO-OP
}
}