blob: 1d2684d30da5cf849b4a6bc4f87f7b40c94430c8 [file] [log] [blame]
/*
* Copyright (c) 2002, 2004, 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.orb ;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress ;
import java.security.PrivilegedAction ;
import java.security.PrivilegedExceptionAction ;
import java.security.AccessController ;
import java.util.Collection ;
import java.util.Iterator ;
import org.omg.CORBA.CompletionStatus ;
import org.omg.CORBA.portable.ValueFactory ;
import com.sun.corba.se.pept.protocol.ClientRequestDispatcher ;
import com.sun.corba.se.pept.transport.Acceptor;
import com.sun.corba.se.spi.activation.Locator ;
import com.sun.corba.se.spi.activation.Activator ;
import com.sun.corba.se.spi.activation.LocatorHelper ;
import com.sun.corba.se.spi.activation.ActivatorHelper ;
import com.sun.corba.se.spi.activation.EndPointInfo ;
import com.sun.corba.se.spi.copyobject.ObjectCopierFactory ;
import com.sun.corba.se.spi.copyobject.CopyobjectDefaults ;
import com.sun.corba.se.spi.copyobject.CopierManager ;
import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ;
import com.sun.corba.se.spi.ior.IOR;
import com.sun.corba.se.spi.ior.IORFactories ;
import com.sun.corba.se.spi.ior.iiop.IIOPFactories ;
import com.sun.corba.se.spi.legacy.connection.ORBSocketFactory;
import com.sun.corba.se.spi.logging.CORBALogDomains ;
import com.sun.corba.se.spi.oa.OADefault ;
import com.sun.corba.se.spi.oa.ObjectAdapter ;
import com.sun.corba.se.spi.oa.ObjectAdapterFactory ;
import com.sun.corba.se.spi.orb.Operation ;
import com.sun.corba.se.spi.orb.OperationFactory ;
import com.sun.corba.se.spi.orb.ORBData ;
import com.sun.corba.se.spi.orb.DataCollector ;
import com.sun.corba.se.spi.orb.ORBConfigurator ;
import com.sun.corba.se.spi.orb.ParserImplBase ;
import com.sun.corba.se.spi.orb.PropertyParser ;
import com.sun.corba.se.spi.orb.ORB ;
import com.sun.corba.se.spi.orbutil.closure.Closure ;
import com.sun.corba.se.spi.orbutil.closure.ClosureFactory ;
import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ;
import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ;
import com.sun.corba.se.spi.protocol.RequestDispatcherDefault ;
import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcherFactory ;
import com.sun.corba.se.spi.resolver.LocalResolver ;
import com.sun.corba.se.spi.resolver.Resolver ;
import com.sun.corba.se.spi.resolver.ResolverDefault ;
import com.sun.corba.se.spi.transport.CorbaContactInfoList;
import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory;
import com.sun.corba.se.spi.transport.SocketInfo;
import com.sun.corba.se.spi.transport.TransportDefault ;
import com.sun.corba.se.spi.presentation.rmi.PresentationManager ;
import com.sun.corba.se.spi.presentation.rmi.PresentationDefaults ;
import com.sun.corba.se.spi.servicecontext.ServiceContext ;
import com.sun.corba.se.spi.servicecontext.ServiceContextRegistry ;
import com.sun.corba.se.spi.servicecontext.UEInfoServiceContext ;
import com.sun.corba.se.spi.servicecontext.CodeSetServiceContext ;
import com.sun.corba.se.spi.servicecontext.SendingContextServiceContext ;
import com.sun.corba.se.spi.servicecontext.ORBVersionServiceContext ;
import com.sun.corba.se.spi.servicecontext.MaxStreamFormatVersionServiceContext ;
import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
import com.sun.corba.se.impl.transport.SocketOrChannelAcceptorImpl;
// XXX This should go away once we get rid of the port exchange for ORBD
import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo;
import com.sun.corba.se.impl.legacy.connection.SocketFactoryAcceptorImpl;
import com.sun.corba.se.impl.legacy.connection.SocketFactoryContactInfoListImpl;
import com.sun.corba.se.impl.legacy.connection.USLPort;
// XXX These should move to SPI
import com.sun.corba.se.impl.orbutil.ORBConstants ;
// XXX This needs an SPI
import com.sun.corba.se.impl.dynamicany.DynAnyFactoryImpl ;
public class ORBConfiguratorImpl implements ORBConfigurator {
private ORBUtilSystemException wrapper ;
public static class ConfigParser extends ParserImplBase {
public Class[] userConfigurators = null ;
public PropertyParser makeParser()
{
PropertyParser parser = new PropertyParser() ;
Operation action = OperationFactory.compose(
OperationFactory.suffixAction(),
OperationFactory.classAction()
) ;
parser.addPrefix( ORBConstants.SUN_PREFIX + "ORBUserConfigurators",
action, "userConfigurators", Class.class ) ;
return parser ;
}
}
public void configure( DataCollector collector, ORB orb )
{
ORB theOrb = orb ;
wrapper = ORBUtilSystemException.get( orb, CORBALogDomains.ORB_LIFECYCLE ) ;
initObjectCopiers( theOrb ) ;
initIORFinders( theOrb ) ;
theOrb.setClientDelegateFactory(
// REVISIT: this should be ProtocolDefault.
TransportDefault.makeClientDelegateFactory( theOrb )) ;
initializeTransport(theOrb) ;
initializeNaming( theOrb ) ;
initServiceContextRegistry( theOrb ) ;
initRequestDispatcherRegistry( theOrb ) ;
registerInitialReferences( theOrb ) ;
persistentServerInitialization( theOrb ) ;
runUserConfigurators( collector, theOrb ) ;
}
private void runUserConfigurators( DataCollector collector, ORB orb )
{
// Run any pluggable configurators. This is a lot like
// ORBInitializers, only it uses the internal ORB and has
// access to all data for parsing.
ConfigParser parser = new ConfigParser() ;
parser.init( collector ) ;
if (parser.userConfigurators != null) {
for (int ctr=0; ctr<parser.userConfigurators.length; ctr++) {
Class cls = parser.userConfigurators[ctr] ;
try {
ORBConfigurator config = (ORBConfigurator)(cls.newInstance()) ;
config.configure( collector, orb ) ;
} catch (Exception exc) {
// XXX Log this exception
// ignore this for now: a bad user configurator does nothing
}
}
}
}
private void persistentServerInitialization( ORB orb )
{
ORBData data = orb.getORBData() ;
// determine the ORBD port so that persistent objrefs can be
// created.
if (data.getServerIsORBActivated()) {
try {
Locator locator = LocatorHelper.narrow(
orb.resolve_initial_references(
ORBConstants.SERVER_LOCATOR_NAME )) ;
Activator activator = ActivatorHelper.narrow(
orb.resolve_initial_references(
ORBConstants.SERVER_ACTIVATOR_NAME )) ;
Collection serverEndpoints =
orb.getCorbaTransportManager().getAcceptors(null, null);
EndPointInfo[] endpointList =
new EndPointInfo[serverEndpoints.size()];
Iterator iterator = serverEndpoints.iterator();
int i = 0 ;
while (iterator.hasNext()) {
Object n = iterator.next();
if (! (n instanceof LegacyServerSocketEndPointInfo)) {
continue;
}
LegacyServerSocketEndPointInfo ep =
(LegacyServerSocketEndPointInfo) n;
// REVISIT - use exception instead of -1.
int port = locator.getEndpoint(ep.getType());
if (port == -1) {
port = locator.getEndpoint(SocketInfo.IIOP_CLEAR_TEXT);
if (port == -1) {
throw new Exception(
"ORBD must support IIOP_CLEAR_TEXT");
}
}
ep.setLocatorPort(port);
endpointList[i++] =
new EndPointInfo(ep.getType(), ep.getPort());
}
activator.registerEndpoints(
data.getPersistentServerId(), data.getORBId(),
endpointList);
} catch (Exception ex) {
throw wrapper.persistentServerInitError(
CompletionStatus.COMPLETED_MAYBE, ex ) ;
}
}
}
/**
* This is made somewhat complex because we are currently supporting
* the ContactInfoList/Acceptor *AND* the legacy SocketFactory
* transport architecture.
*/
private void initializeTransport(final ORB orb)
{
ORBData od = orb.getORBData();
CorbaContactInfoListFactory contactInfoListFactory =
od.getCorbaContactInfoListFactory();
Acceptor[] acceptors = od.getAcceptors();
// BEGIN Legacy
ORBSocketFactory legacySocketFactory = od.getLegacySocketFactory();
USLPort[] uslPorts = od.getUserSpecifiedListenPorts() ;
setLegacySocketFactoryORB(orb, legacySocketFactory);
// END Legacy
//
// Check for incorrect configuration.
//
if (legacySocketFactory != null && contactInfoListFactory != null) {
throw wrapper.socketFactoryAndContactInfoListAtSameTime();
}
if (acceptors.length != 0 && legacySocketFactory != null) {
throw wrapper.acceptorsAndLegacySocketFactoryAtSameTime();
}
//
// Client and Server side setup.
//
od.getSocketFactory().setORB(orb);
//
// Set up client side.
//
if (legacySocketFactory != null) {
// BEGIN Legacy
// Since the user specified a legacy socket factory we need to
// use a ContactInfoList that will use the legacy socket factory.
contactInfoListFactory =
new CorbaContactInfoListFactory() {
public void setORB(ORB orb) { }
public CorbaContactInfoList create( IOR ior ) {
return new SocketFactoryContactInfoListImpl(
orb, ior);
}
};
// END Legacy
} else if (contactInfoListFactory != null) {
// The user specified an explicit ContactInfoListFactory.
contactInfoListFactory.setORB(orb);
} else {
// Use the default.
contactInfoListFactory =
TransportDefault.makeCorbaContactInfoListFactory(orb);
}
orb.setCorbaContactInfoListFactory(contactInfoListFactory);
//
// Set up server side.
//
//
// Maybe allocate the Legacy default listener.
//
// If old legacy properties set, or there are no explicit
// acceptors then register a default listener. Type of
// default listener depends on presence of legacy socket factory.
//
// Note: this must happen *BEFORE* registering explicit acceptors.
//
// BEGIN Legacy
int port = -1;
if (od.getORBServerPort() != 0) {
port = od.getORBServerPort();
} else if (od.getPersistentPortInitialized()) {
port = od.getPersistentServerPort();
} else if (acceptors.length == 0) {
port = 0;
}
if (port != -1) {
createAndRegisterAcceptor(orb, legacySocketFactory, port,
LegacyServerSocketEndPointInfo.DEFAULT_ENDPOINT,
SocketInfo.IIOP_CLEAR_TEXT);
}
// END Legacy
for (int i = 0; i < acceptors.length; i++) {
orb.getCorbaTransportManager().registerAcceptor(acceptors[i]);
}
// BEGIN Legacy
// Allocate user listeners.
USLPort[] ports = od.getUserSpecifiedListenPorts() ;
if (ports != null) {
for (int i = 0; i < ports.length; i++) {
createAndRegisterAcceptor(
orb, legacySocketFactory, ports[i].getPort(),
LegacyServerSocketEndPointInfo.NO_NAME,
ports[i].getType());
}
}
// END Legacy
}
/*
* Legacy: name.
*/
// REVISIT: see ORBD. make factory in TransportDefault.
private void createAndRegisterAcceptor(ORB orb,
ORBSocketFactory legacySocketFactory,
int port, String name, String type)
{
Acceptor acceptor;
if (legacySocketFactory == null) {
acceptor =
new SocketOrChannelAcceptorImpl(orb, port, name, type);
} else {
acceptor =
new SocketFactoryAcceptorImpl(orb, port, name, type);
}
orb.getTransportManager().registerAcceptor(acceptor);
}
private void setLegacySocketFactoryORB(
final ORB orb, final ORBSocketFactory legacySocketFactory)
{
if (legacySocketFactory == null) {
return;
}
// Note: the createServerSocket and createSocket methods on the
// DefaultSocketFactory need to get data from the ORB but
// we cannot change the interface. So set the ORB (if it's ours)
// by reflection.
try {
AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run()
throws InstantiationException, IllegalAccessException
{
try {
Class[] params = { ORB.class };
Method method =
legacySocketFactory.getClass().getMethod(
"setORB", params);
Object[] args = { orb };
method.invoke(legacySocketFactory, args);
} catch (NoSuchMethodException e) {
// NOTE: If there is no method then it
// is not ours - so ignore it.
;
} catch (IllegalAccessException e) {
RuntimeException rte = new RuntimeException();
rte.initCause(e);
throw rte;
} catch (InvocationTargetException e) {
RuntimeException rte = new RuntimeException();
rte.initCause(e);
throw rte;
}
return null;
}
}
);
} catch (Throwable t) {
throw wrapper.unableToSetSocketFactoryOrb(t);
}
}
private void initializeNaming( ORB orb )
{
LocalResolver localResolver = ResolverDefault.makeLocalResolver() ;
orb.setLocalResolver( localResolver ) ;
Resolver bootResolver = ResolverDefault.makeBootstrapResolver( orb,
orb.getORBData().getORBInitialHost(),
orb.getORBData().getORBInitialPort() ) ;
Operation urlOperation = ResolverDefault.makeINSURLOperation( orb,
bootResolver ) ;
orb.setURLOperation( urlOperation ) ;
Resolver irResolver = ResolverDefault.makeORBInitRefResolver( urlOperation,
orb.getORBData().getORBInitialReferences() ) ;
Resolver dirResolver = ResolverDefault.makeORBDefaultInitRefResolver(
urlOperation, orb.getORBData().getORBDefaultInitialReference() ) ;
Resolver resolver =
ResolverDefault.makeCompositeResolver( localResolver,
ResolverDefault.makeCompositeResolver( irResolver,
ResolverDefault.makeCompositeResolver( dirResolver,
bootResolver ) ) ) ;
orb.setResolver( resolver ) ;
}
private void initServiceContextRegistry( ORB orb )
{
ServiceContextRegistry scr = orb.getServiceContextRegistry() ;
scr.register( UEInfoServiceContext.class ) ;
scr.register( CodeSetServiceContext.class ) ;
scr.register( SendingContextServiceContext.class ) ;
scr.register( ORBVersionServiceContext.class ) ;
scr.register( MaxStreamFormatVersionServiceContext.class ) ;
}
private void registerInitialReferences( final ORB orb )
{
// Register the Dynamic Any factory
Closure closure = new Closure() {
public java.lang.Object evaluate() {
return new DynAnyFactoryImpl( orb ) ;
}
} ;
Closure future = ClosureFactory.makeFuture( closure ) ;
orb.getLocalResolver().register( ORBConstants.DYN_ANY_FACTORY_NAME,
future ) ;
}
private static final int ORB_STREAM = 0 ;
private void initObjectCopiers( ORB orb )
{
// No optimization or policy selection here.
ObjectCopierFactory orbStream =
CopyobjectDefaults.makeORBStreamObjectCopierFactory( orb ) ;
CopierManager cm = orb.getCopierManager() ;
cm.setDefaultId( ORB_STREAM ) ;
cm.registerObjectCopierFactory( orbStream, ORB_STREAM ) ;
}
private void initIORFinders( ORB orb )
{
IdentifiableFactoryFinder profFinder =
orb.getTaggedProfileFactoryFinder() ;
profFinder.registerFactory( IIOPFactories.makeIIOPProfileFactory() ) ;
IdentifiableFactoryFinder profTempFinder =
orb.getTaggedProfileTemplateFactoryFinder() ;
profTempFinder.registerFactory(
IIOPFactories.makeIIOPProfileTemplateFactory() ) ;
IdentifiableFactoryFinder compFinder =
orb.getTaggedComponentFactoryFinder() ;
compFinder.registerFactory(
IIOPFactories.makeCodeSetsComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeJavaCodebaseComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeORBTypeComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeMaxStreamFormatVersionComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeAlternateIIOPAddressComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeRequestPartitioningComponentFactory() ) ;
compFinder.registerFactory(
IIOPFactories.makeJavaSerializationComponentFactory());
// Register the ValueFactory instances for ORT
IORFactories.registerValueFactories( orb ) ;
// Register an ObjectKeyFactory
orb.setObjectKeyFactory( IORFactories.makeObjectKeyFactory(orb) ) ;
}
private void initRequestDispatcherRegistry( ORB orb )
{
RequestDispatcherRegistry scr = orb.getRequestDispatcherRegistry() ;
// register client subcontracts
ClientRequestDispatcher csub =
RequestDispatcherDefault.makeClientRequestDispatcher() ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.TOA_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.TRANSIENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.PERSISTENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.SC_TRANSIENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.SC_PERSISTENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.IISC_TRANSIENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.IISC_PERSISTENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.MINSC_TRANSIENT_SCID ) ;
scr.registerClientRequestDispatcher( csub,
ORBConstants.MINSC_PERSISTENT_SCID ) ;
// register server delegates
CorbaServerRequestDispatcher sd =
RequestDispatcherDefault.makeServerRequestDispatcher( orb );
scr.registerServerRequestDispatcher( sd,
ORBConstants.TOA_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.TRANSIENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.PERSISTENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.SC_TRANSIENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.SC_PERSISTENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.IISC_TRANSIENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.IISC_PERSISTENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.MINSC_TRANSIENT_SCID ) ;
scr.registerServerRequestDispatcher( sd,
ORBConstants.MINSC_PERSISTENT_SCID ) ;
orb.setINSDelegate(
RequestDispatcherDefault.makeINSServerRequestDispatcher( orb ) ) ;
// register local client subcontracts
LocalClientRequestDispatcherFactory lcsf =
RequestDispatcherDefault.makeJIDLLocalClientRequestDispatcherFactory(
orb ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.TOA_SCID ) ;
lcsf =
RequestDispatcherDefault.makePOALocalClientRequestDispatcherFactory(
orb ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.TRANSIENT_SCID ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.PERSISTENT_SCID ) ;
lcsf = RequestDispatcherDefault.
makeFullServantCacheLocalClientRequestDispatcherFactory( orb ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.SC_TRANSIENT_SCID ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.SC_PERSISTENT_SCID ) ;
lcsf = RequestDispatcherDefault.
makeInfoOnlyServantCacheLocalClientRequestDispatcherFactory( orb ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.IISC_TRANSIENT_SCID ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.IISC_PERSISTENT_SCID ) ;
lcsf = RequestDispatcherDefault.
makeMinimalServantCacheLocalClientRequestDispatcherFactory( orb ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.MINSC_TRANSIENT_SCID ) ;
scr.registerLocalClientRequestDispatcherFactory( lcsf,
ORBConstants.MINSC_PERSISTENT_SCID ) ;
/* Register the server delegate that implements the ancient bootstrap
* naming protocol. This takes an object key of either "INIT" or
* "TINI" to allow for big or little endian implementations.
*/
CorbaServerRequestDispatcher bootsd =
RequestDispatcherDefault.makeBootstrapServerRequestDispatcher(
orb ) ;
scr.registerServerRequestDispatcher( bootsd, "INIT" ) ;
scr.registerServerRequestDispatcher( bootsd, "TINI" ) ;
// Register object adapter factories
ObjectAdapterFactory oaf = OADefault.makeTOAFactory( orb ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.TOA_SCID ) ;
oaf = OADefault.makePOAFactory( orb ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.TRANSIENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.PERSISTENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.SC_TRANSIENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.SC_PERSISTENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.IISC_TRANSIENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.IISC_PERSISTENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.MINSC_TRANSIENT_SCID ) ;
scr.registerObjectAdapterFactory( oaf, ORBConstants.MINSC_PERSISTENT_SCID ) ;
}
}
// End of file.