| /* |
| * Copyright (c) 1997, 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.oa.poa; |
| |
| import java.util.HashMap ; |
| import java.util.BitSet ; |
| import java.util.Iterator ; |
| |
| import com.sun.corba.se.impl.orbutil.ORBConstants ; |
| import com.sun.corba.se.spi.extension.ServantCachingPolicy ; |
| import com.sun.corba.se.spi.extension.ZeroPortPolicy ; |
| import com.sun.corba.se.spi.extension.CopyObjectPolicy ; |
| |
| import org.omg.CORBA.*; |
| import org.omg.PortableServer.*; |
| import org.omg.PortableServer.POAPackage.*; |
| |
| public final class Policies { |
| /* Order of *POLICY_ID : |
| THREAD_ |
| LIFESPAN_ |
| ID_UNIQUENESS_ |
| ID_ASSIGNMENT_ |
| IMPLICIT_ACTIVATION_ |
| SERvANT_RETENTION_ |
| REQUEST_PROCESSING_ |
| The code in this class depends on this order! |
| */ |
| private static final int MIN_POA_POLICY_ID = THREAD_POLICY_ID.value ; |
| private static final int MAX_POA_POLICY_ID = REQUEST_PROCESSING_POLICY_ID.value ; |
| private static final int POLICY_TABLE_SIZE = MAX_POA_POLICY_ID - |
| MIN_POA_POLICY_ID + 1 ; |
| |
| int defaultObjectCopierFactoryId ; |
| |
| private HashMap policyMap = new HashMap() ; // Maps Integer(policy type) to Policy |
| |
| public static final Policies defaultPolicies |
| = new Policies() ; |
| |
| public static final Policies rootPOAPolicies |
| = new Policies( |
| ThreadPolicyValue._ORB_CTRL_MODEL, |
| LifespanPolicyValue._TRANSIENT, |
| IdUniquenessPolicyValue._UNIQUE_ID, |
| IdAssignmentPolicyValue._SYSTEM_ID, |
| ImplicitActivationPolicyValue._IMPLICIT_ACTIVATION, |
| ServantRetentionPolicyValue._RETAIN, |
| RequestProcessingPolicyValue._USE_ACTIVE_OBJECT_MAP_ONLY ) ; |
| |
| private int[] poaPolicyValues ; |
| |
| private int getPolicyValue( int id ) |
| { |
| return poaPolicyValues[ id - MIN_POA_POLICY_ID ] ; |
| } |
| |
| private void setPolicyValue( int id, int value ) |
| { |
| poaPolicyValues[ id - MIN_POA_POLICY_ID ] = value ; |
| } |
| |
| private Policies( |
| int threadModel, |
| int lifespan, |
| int idUniqueness, |
| int idAssignment, |
| int implicitActivation, |
| int retention, |
| int requestProcessing ) |
| { |
| poaPolicyValues = new int[] { |
| threadModel, |
| lifespan, |
| idUniqueness, |
| idAssignment, |
| implicitActivation, |
| retention, |
| requestProcessing }; |
| } |
| |
| private Policies() { |
| this( ThreadPolicyValue._ORB_CTRL_MODEL, |
| LifespanPolicyValue._TRANSIENT, |
| IdUniquenessPolicyValue._UNIQUE_ID, |
| IdAssignmentPolicyValue._SYSTEM_ID, |
| ImplicitActivationPolicyValue._NO_IMPLICIT_ACTIVATION, |
| ServantRetentionPolicyValue._RETAIN, |
| RequestProcessingPolicyValue._USE_ACTIVE_OBJECT_MAP_ONLY ) ; |
| } |
| |
| public String toString() { |
| StringBuffer buffer = new StringBuffer(); |
| buffer.append( "Policies[" ) ; |
| boolean first = true ; |
| Iterator iter = policyMap.values().iterator() ; |
| while (iter.hasNext()) { |
| if (first) |
| first = false ; |
| else |
| buffer.append( "," ) ; |
| |
| buffer.append( iter.next().toString() ) ; |
| } |
| buffer.append( "]" ) ; |
| return buffer.toString() ; |
| } |
| |
| /* Returns the integer value of the POA policy, if this is a |
| * POA policy, otherwise returns -1. |
| */ |
| private int getPOAPolicyValue( Policy policy) |
| { |
| if (policy instanceof ThreadPolicy) { |
| return ((ThreadPolicy) policy).value().value(); |
| } else if (policy instanceof LifespanPolicy) { |
| return ((LifespanPolicy) policy).value().value(); |
| } else if (policy instanceof IdUniquenessPolicy) { |
| return ((IdUniquenessPolicy) policy).value().value(); |
| } else if (policy instanceof IdAssignmentPolicy) { |
| return ((IdAssignmentPolicy) policy).value().value(); |
| } else if (policy instanceof ServantRetentionPolicy) { |
| return ((ServantRetentionPolicy) policy).value().value(); |
| } else if (policy instanceof RequestProcessingPolicy) { |
| return ((RequestProcessingPolicy) policy).value().value(); |
| } else if (policy instanceof ImplicitActivationPolicy) { |
| return ((ImplicitActivationPolicy) policy).value().value(); |
| } else |
| return -1 ; |
| } |
| |
| /** If any errors were found, throw INVALID_POLICY with the smallest |
| * index of any offending policy. |
| */ |
| private void checkForPolicyError( BitSet errorSet ) throws InvalidPolicy |
| { |
| for (short ctr=0; ctr<errorSet.length(); ctr++ ) |
| if (errorSet.get(ctr)) |
| throw new InvalidPolicy(ctr); |
| } |
| |
| /** Add the first index in policies at which the policy is of type |
| * policyId to errorSet, if the polictId is in policies (it may not be). |
| */ |
| private void addToErrorSet( Policy[] policies, int policyId, |
| BitSet errorSet ) |
| { |
| for (int ctr=0; ctr<policies.length; ctr++ ) |
| if (policies[ctr].policy_type() == policyId) { |
| errorSet.set( ctr ) ; |
| return ; |
| } |
| } |
| |
| /** Main constructor used from POA::create_POA. This need only be visible |
| * within the POA package. |
| */ |
| Policies(Policy[] policies, int id ) throws InvalidPolicy |
| { |
| // Make sure the defaults are set according to the POA spec |
| this(); |
| |
| defaultObjectCopierFactoryId = id ; |
| |
| if ( policies == null ) |
| return; |
| |
| // Set to record all indices in policies for which errors |
| // were observed. |
| BitSet errorSet = new BitSet( policies.length ) ; |
| |
| for(short i = 0; i < policies.length; i++) { |
| Policy policy = policies[i]; |
| int POAPolicyValue = getPOAPolicyValue( policy ) ; |
| |
| // Save the policy in policyMap to support |
| // POA.get_effective_policy, if it was not already saved |
| // in policyMap. |
| Integer key = new Integer( policy.policy_type() ) ; |
| Policy prev = (Policy)(policyMap.get( key )) ; |
| if (prev == null) |
| policyMap.put( key, policy ) ; |
| |
| if (POAPolicyValue >= 0) { |
| setPolicyValue( key.intValue(), POAPolicyValue ) ; |
| |
| // if the value of this POA policy was previously set to a |
| // different value than the current value given in |
| // POAPolicyValue, record an error. |
| if ((prev != null) && |
| (getPOAPolicyValue( prev ) != POAPolicyValue)) |
| errorSet.set( i ) ; |
| } |
| } |
| |
| // Check for bad policy combinations |
| |
| // NON_RETAIN requires USE_DEFAULT_SERVANT or USE_SERVANT_MANAGER |
| if (!retainServants() && useActiveMapOnly() ) { |
| addToErrorSet( policies, SERVANT_RETENTION_POLICY_ID.value, |
| errorSet ) ; |
| addToErrorSet( policies, REQUEST_PROCESSING_POLICY_ID.value, |
| errorSet ) ; |
| } |
| |
| // IMPLICIT_ACTIVATION requires SYSTEM_ID and RETAIN |
| if (isImplicitlyActivated()) { |
| if (!retainServants()) { |
| addToErrorSet( policies, IMPLICIT_ACTIVATION_POLICY_ID.value, |
| errorSet ) ; |
| addToErrorSet( policies, SERVANT_RETENTION_POLICY_ID.value, |
| errorSet ) ; |
| } |
| |
| if (!isSystemAssignedIds()) { |
| addToErrorSet( policies, IMPLICIT_ACTIVATION_POLICY_ID.value, |
| errorSet ) ; |
| addToErrorSet( policies, ID_ASSIGNMENT_POLICY_ID.value, |
| errorSet ) ; |
| } |
| } |
| |
| checkForPolicyError( errorSet ) ; |
| } |
| |
| public Policy get_effective_policy( int type ) |
| { |
| Integer key = new Integer( type ) ; |
| Policy result = (Policy)(policyMap.get(key)) ; |
| return result ; |
| } |
| |
| /* Thread Policies */ |
| public final boolean isOrbControlledThreads() { |
| return getPolicyValue( THREAD_POLICY_ID.value ) == |
| ThreadPolicyValue._ORB_CTRL_MODEL; |
| } |
| public final boolean isSingleThreaded() { |
| return getPolicyValue( THREAD_POLICY_ID.value ) == |
| ThreadPolicyValue._SINGLE_THREAD_MODEL; |
| } |
| |
| /* Lifespan */ |
| public final boolean isTransient() { |
| return getPolicyValue( LIFESPAN_POLICY_ID.value ) == |
| LifespanPolicyValue._TRANSIENT; |
| } |
| public final boolean isPersistent() { |
| return getPolicyValue( LIFESPAN_POLICY_ID.value ) == |
| LifespanPolicyValue._PERSISTENT; |
| } |
| |
| /* ID Uniqueness */ |
| public final boolean isUniqueIds() { |
| return getPolicyValue( ID_UNIQUENESS_POLICY_ID.value ) == |
| IdUniquenessPolicyValue._UNIQUE_ID; |
| } |
| public final boolean isMultipleIds() { |
| return getPolicyValue( ID_UNIQUENESS_POLICY_ID.value ) == |
| IdUniquenessPolicyValue._MULTIPLE_ID; |
| } |
| |
| /* ID Assignment */ |
| public final boolean isUserAssignedIds() { |
| return getPolicyValue( ID_ASSIGNMENT_POLICY_ID.value ) == |
| IdAssignmentPolicyValue._USER_ID; |
| } |
| public final boolean isSystemAssignedIds() { |
| return getPolicyValue( ID_ASSIGNMENT_POLICY_ID.value ) == |
| IdAssignmentPolicyValue._SYSTEM_ID; |
| } |
| |
| /* Servant Rentention */ |
| public final boolean retainServants() { |
| return getPolicyValue( SERVANT_RETENTION_POLICY_ID.value ) == |
| ServantRetentionPolicyValue._RETAIN; |
| } |
| |
| /* Request Processing */ |
| public final boolean useActiveMapOnly() { |
| return getPolicyValue( REQUEST_PROCESSING_POLICY_ID.value ) == |
| RequestProcessingPolicyValue._USE_ACTIVE_OBJECT_MAP_ONLY; |
| } |
| public final boolean useDefaultServant() { |
| return getPolicyValue( REQUEST_PROCESSING_POLICY_ID.value ) == |
| RequestProcessingPolicyValue._USE_DEFAULT_SERVANT; |
| } |
| public final boolean useServantManager() { |
| return getPolicyValue( REQUEST_PROCESSING_POLICY_ID.value ) == |
| RequestProcessingPolicyValue._USE_SERVANT_MANAGER; |
| } |
| |
| /* Implicit Activation */ |
| public final boolean isImplicitlyActivated() { |
| return getPolicyValue( IMPLICIT_ACTIVATION_POLICY_ID.value ) == |
| ImplicitActivationPolicyValue._IMPLICIT_ACTIVATION; |
| } |
| |
| /* proprietary servant caching policy */ |
| public final int servantCachingLevel() |
| { |
| Integer key = new Integer( ORBConstants.SERVANT_CACHING_POLICY ) ; |
| ServantCachingPolicy policy = (ServantCachingPolicy)policyMap.get( key ) ; |
| if (policy == null) |
| return ServantCachingPolicy.NO_SERVANT_CACHING ; |
| else |
| return policy.getType() ; |
| } |
| |
| public final boolean forceZeroPort() |
| { |
| Integer key = new Integer( ORBConstants.ZERO_PORT_POLICY ) ; |
| ZeroPortPolicy policy = (ZeroPortPolicy)policyMap.get( key ) ; |
| if (policy == null) |
| return false ; |
| else |
| return policy.forceZeroPort() ; |
| } |
| |
| public final int getCopierId() |
| { |
| Integer key = new Integer( ORBConstants.COPY_OBJECT_POLICY ) ; |
| CopyObjectPolicy policy = (CopyObjectPolicy)policyMap.get( key ) ; |
| if (policy != null) |
| return policy.getValue() ; |
| else |
| return defaultObjectCopierFactoryId ; |
| } |
| } |