1 /*
   2  * Copyright (c) 2002, 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.impl.protocol;
  27 
  28 import java.util.Set;
  29 import java.util.HashSet;
  30 import java.util.Map;
  31 import java.util.HashMap;
  32 import java.util.Collections;
  33 
  34 import com.sun.corba.se.pept.protocol.ClientRequestDispatcher ;
  35 
  36 import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcher ;
  37 import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcherFactory ;
  38 import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ;
  39 import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ;
  40 
  41 import com.sun.corba.se.spi.oa.ObjectAdapterFactory ;
  42 
  43 import com.sun.corba.se.spi.orb.ORB ;
  44 
  45 import com.sun.corba.se.impl.orbutil.ORBConstants ;
  46 import com.sun.corba.se.impl.orbutil.DenseIntMapImpl ;
  47 
  48 /**
  49  * This is a registry of all subcontract ID dependent objects.  This includes:
  50  * LocalClientRequestDispatcherFactory, ClientRequestDispatcher, ServerSubcontract, and
  51  * ObjectAdapterFactory.
  52  */
  53 public class RequestDispatcherRegistryImpl implements RequestDispatcherRegistry {
  54     private ORB orb;
  55 
  56     protected int defaultId;                    // The default subcontract ID to use if
  57                                                 // there is no more specific ID available.
  58                                                 // This happens when invoking a foreign IOR.
  59     private DenseIntMapImpl SDRegistry ;        // ServerRequestDispatcher registry
  60     private DenseIntMapImpl CSRegistry ;        // ClientRequestDispatcher registry
  61     private DenseIntMapImpl OAFRegistry ;       // ObjectAdapterFactory registry
  62     private DenseIntMapImpl LCSFRegistry ;      // LocalClientRequestDispatcherFactory registry
  63     private Set objectAdapterFactories ;        // Set of all ObjectAdapterFactory instances
  64     private Set objectAdapterFactoriesView ;    // Read-only view of oaf instances
  65     private Map stringToServerSubcontract ;     // Map from obect key string to
  66                                                 // ServerSubcontract
  67                                                 // for special bootstrap IORs
  68 
  69     public RequestDispatcherRegistryImpl(ORB orb, int defaultId )
  70     {
  71         this.orb = orb;
  72         this.defaultId = defaultId;
  73         SDRegistry = new DenseIntMapImpl() ;
  74         CSRegistry = new DenseIntMapImpl() ;
  75         OAFRegistry = new DenseIntMapImpl() ;
  76         LCSFRegistry = new DenseIntMapImpl() ;
  77         objectAdapterFactories = new HashSet() ;
  78         objectAdapterFactoriesView = Collections.unmodifiableSet( objectAdapterFactories ) ;
  79         stringToServerSubcontract = new HashMap() ;
  80     }
  81 
  82     public synchronized void registerClientRequestDispatcher(
  83         ClientRequestDispatcher csc, int scid)
  84     {
  85         CSRegistry.set( scid, csc ) ;
  86     }
  87 
  88     public synchronized void registerLocalClientRequestDispatcherFactory(
  89         LocalClientRequestDispatcherFactory csc, int scid)
  90     {
  91         LCSFRegistry.set( scid, csc ) ;
  92     }
  93 
  94     public synchronized void registerServerRequestDispatcher(
  95         CorbaServerRequestDispatcher ssc, int scid)
  96     {
  97         SDRegistry.set( scid, ssc ) ;
  98     }
  99 
 100     public synchronized void registerServerRequestDispatcher(
 101         CorbaServerRequestDispatcher scc, String name )
 102     {
 103         stringToServerSubcontract.put( name, scc ) ;
 104     }
 105 
 106     public synchronized void registerObjectAdapterFactory(
 107         ObjectAdapterFactory oaf, int scid)
 108     {
 109         objectAdapterFactories.add( oaf ) ;
 110         OAFRegistry.set( scid, oaf ) ;
 111     }
 112 
 113     // **************************************************
 114     // Methods to find the subcontract side subcontract
 115     // **************************************************
 116 
 117     // Note that both forms of getServerRequestDispatcher need to return
 118     // the default server delegate if no other match is found.
 119     // This is essential to proper handling of errors for
 120     // malformed requests.  In particular, a bad MAGIC will
 121     // result in a lookup in the named key table (stringToServerSubcontract),
 122     // which must return a valid ServerRequestDispatcher.  A bad subcontract ID
 123     // will similarly need to return the default ServerRequestDispatcher.
 124 
 125     public CorbaServerRequestDispatcher getServerRequestDispatcher(int scid)
 126     {
 127         CorbaServerRequestDispatcher sdel =
 128             (CorbaServerRequestDispatcher)(SDRegistry.get(scid)) ;
 129         if ( sdel == null )
 130             sdel = (CorbaServerRequestDispatcher)(SDRegistry.get(defaultId)) ;
 131 
 132         return sdel;
 133     }
 134 
 135     public CorbaServerRequestDispatcher getServerRequestDispatcher( String name )
 136     {
 137         CorbaServerRequestDispatcher sdel =
 138             (CorbaServerRequestDispatcher)stringToServerSubcontract.get( name ) ;
 139 
 140         if ( sdel == null )
 141             sdel = (CorbaServerRequestDispatcher)(SDRegistry.get(defaultId)) ;
 142 
 143         return sdel;
 144     }
 145 
 146     public LocalClientRequestDispatcherFactory getLocalClientRequestDispatcherFactory(
 147         int scid )
 148     {
 149         LocalClientRequestDispatcherFactory factory =
 150             (LocalClientRequestDispatcherFactory)(LCSFRegistry.get(scid)) ;
 151         if (factory == null) {
 152             factory = (LocalClientRequestDispatcherFactory)(LCSFRegistry.get(defaultId)) ;
 153         }
 154 
 155         return factory ;
 156     }
 157 
 158     public ClientRequestDispatcher getClientRequestDispatcher( int scid )
 159     {
 160         ClientRequestDispatcher subcontract =
 161             (ClientRequestDispatcher)(CSRegistry.get(scid)) ;
 162         if (subcontract == null) {
 163             subcontract = (ClientRequestDispatcher)(CSRegistry.get(defaultId)) ;
 164         }
 165 
 166         return subcontract ;
 167     }
 168 
 169     public ObjectAdapterFactory getObjectAdapterFactory( int scid )
 170     {
 171         ObjectAdapterFactory oaf =
 172             (ObjectAdapterFactory)(OAFRegistry.get(scid)) ;
 173         if ( oaf == null )
 174             oaf = (ObjectAdapterFactory)(OAFRegistry.get(defaultId)) ;
 175 
 176         return oaf;
 177     }
 178 
 179     public Set getObjectAdapterFactories()
 180     {
 181         return objectAdapterFactoriesView ;
 182     }
 183 }