blob: a7493efe36b37d1058ea1a37fde1b21e2a0bc20c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.yoko.orb.OB;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.yoko.orb.OB.BootManager;
import org.apache.yoko.orb.OB.DispatchStrategyFactory;
import org.apache.yoko.orb.OB.Logger;
import org.apache.yoko.orb.OB.URLRegistry;
import org.apache.yoko.orb.OB.UnknownExceptionStrategy;
public final class ORBInstance {
private boolean destroy_; // True if destroy() was called
//
// Reference to ORB is needed in Java
//
private org.omg.CORBA.ORB orb_;
//
// The native codesets
//
private int nativeCs_;
private int nativeWcs_;
//
// The default wchar codeset (should be 0 according to specification)
//
private int defaultWcs_;
//
// The ORB id
//
private String orbId_;
//
// The Server id
//
private String serverId_;
//
// The Server instance-id
//
private String serverInstance_;
private ObjectFactory objectFactory_;
private ClientManager clientManager_;
private PolicyFactoryManager policyFactoryManager_;
private PIManager interceptorManager_;
private InitialServiceManager initServiceManager_;
private ValueFactoryManager valueFactoryManager_;
private org.omg.IOP.CodecFactory codecFactory_;
private org.apache.yoko.orb.OBPortableServer.POAManagerFactory pmFactory_;
private MultiRequestSender multiRequestSender_;
private java.util.Properties properties_;
private DispatchStrategyFactory dispatchStrategyFactory_;
private BootManager bootManager_;
private Logger logger_;
private CoreTraceLevels coreTraceLevels_;
private RecursiveMutex orbSyncMutex_ = new RecursiveMutex();
private ExecutorService serverExecutor_;
private Phaser serverPhaser = new Phaser(1);
private ExecutorService clientExecutor_;
private Phaser clientPhaser = new Phaser(1);
private org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry_;
private org.apache.yoko.orb.OCI.AccFactoryRegistry accFactoryRegistry_;
private UnknownExceptionStrategy unknownExceptionStrategy_;
private URLRegistry urlRegistry_;
private boolean useTypeCodeCache_;
private boolean extendedWchar_;
//
// the async message handler
//
OrbAsyncHandler asyncHandler_ = null;
// ----------------------------------------------------------------------
// ORBInstance private and protected member implementations
// ----------------------------------------------------------------------
protected void finalize() throws Throwable {
Assert._OB_assert(destroy_);
super.finalize();
}
// ----------------------------------------------------------------------
// ORBInstance package member implementations
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// ORBInstance public member implementations
// ----------------------------------------------------------------------
public ORBInstance(org.omg.CORBA.ORB orb, String orbId, String serverId,
String serverInstance, ObjectFactory objectFactory,
ClientManager clientManager,
PolicyFactoryManager policyFactoryManager, PIManager piManager,
InitialServiceManager initServiceManager,
ValueFactoryManager valueFactoryManager,
org.omg.IOP.CodecFactory codecFactory,
org.apache.yoko.orb.OBPortableServer.POAManagerFactory pmFactory,
MultiRequestSender multiRequestSender,
java.util.Properties properties,
DispatchStrategyFactory dispatchStrategyFactory,
BootManager bootManager, Logger logger,
CoreTraceLevels coreTraceLevels,
org.apache.yoko.orb.OCI.ConFactoryRegistry conFactoryRegistry,
org.apache.yoko.orb.OCI.AccFactoryRegistry accFactoryRegistry,
UnknownExceptionStrategy unknownExceptionStrategy,
URLRegistry urlRegistry, int nativeCs, int nativeWcs, int defaultWcs) {
orb_ = orb;
orbId_ = orbId;
serverId_ = serverId;
serverInstance_ = serverInstance;
objectFactory_ = objectFactory;
clientManager_ = clientManager;
policyFactoryManager_ = policyFactoryManager;
interceptorManager_ = piManager;
initServiceManager_ = initServiceManager;
valueFactoryManager_ = valueFactoryManager;
codecFactory_ = codecFactory;
pmFactory_ = pmFactory;
multiRequestSender_ = multiRequestSender;
properties_ = properties;
dispatchStrategyFactory_ = dispatchStrategyFactory;
bootManager_ = bootManager;
logger_ = logger;
coreTraceLevels_ = coreTraceLevels;
conFactoryRegistry_ = conFactoryRegistry;
accFactoryRegistry_ = accFactoryRegistry;
unknownExceptionStrategy_ = unknownExceptionStrategy;
urlRegistry_ = urlRegistry;
nativeCs_ = nativeCs;
nativeWcs_ = nativeWcs;
defaultWcs_ = defaultWcs;
//
// Create the server and client executors
// TODO why are these separate?
//
clientExecutor_ = Executors.newCachedThreadPool();
serverExecutor_ = Executors.newCachedThreadPool();
//
// Use the TypeCode cache?
//
String tcc = properties_.getProperty("yoko.orb.use_type_code_cache");
if (tcc != null && tcc.equals("false"))
useTypeCodeCache_ = false;
else
useTypeCodeCache_ = true;
//
// Support wchar/wstring for IIOP 1.0?
//
String extWchar = properties_.getProperty("yoko.orb.extended_wchar");
if (extWchar != null && extWchar.equals("true"))
extendedWchar_ = true;
else
extendedWchar_ = false;
//
// get the number of AMI worker threads
//
String amiWorkersStr = properties_.getProperty("yoko.orb.ami_workers");
int amiWorkers = 1;
if (amiWorkersStr != null) {
amiWorkers = Integer.parseInt(amiWorkersStr);
if (amiWorkers <= 0)
amiWorkers = 1;
}
//
// the Asynchonous message handler
//
asyncHandler_ = new OrbAsyncHandler(amiWorkers);
}
public void destroy() {
Assert._OB_assert(!destroy_); // May only be destroyed once
destroy_ = true;
//
// Destroy the POAManagerFactory
//
pmFactory_.destroy();
pmFactory_ = null;
//
// Destroy the Initial Service manager
//
initServiceManager_.destroy();
initServiceManager_ = null;
//
// Destroy the Object factory
//
objectFactory_.destroy();
objectFactory_ = null;
//
// Destroy the ClientManager
//
// ORBControl destroys the ClientManager
// clientManager_.destroy();
clientManager_ = null;
//
// Destroy the PolicyFactoryManager
//
policyFactoryManager_.destroy();
policyFactoryManager_ = null;
//
// Destroy the PortableInterceptor manager
//
interceptorManager_.destroy();
interceptorManager_ = null;
//
// Destroy the ValueFactory manager
//
valueFactoryManager_.destroy();
valueFactoryManager_ = null;
//
// Destroy the CodecFactory
//
// codecFactory_.destroy(); // No destroy operation defined
codecFactory_ = null;
//
// Destroy the MultiRequestSender factory
//
// multiRequestSender_.destroy(); // No destroy operation defined
multiRequestSender_ = null;
//
// Properties are not destroyed -- they are indestructible
//
// properties_.destroy(); // No destroy operation defined
// properties_ = null;
//
// Destroy the dispatch strategy factory
//
// NOTE: destruction is taken care of in ORBControl
//
// ((DispatchStrategyFactory_impl)dispatchStrategyFactory_).
// _OB_destroy();
dispatchStrategyFactory_ = null;
//
// Destroy the BootManager
//
// bootManager_.destroy(); // No destroy operation defined
bootManager_ = null;
//
// Logger is not destroyed -- it is indestructible
//
// logger_.destroy();
// logger_ = null;
//
// CoreTraceLevels is not destroyed -- it is indestructible
//
// coreTraceLevels_.destroy();
// coreTraceLevels_ = null;
// Client and server executors shut down in the ORBControl
//
// Destroy the ConFactoryRegistry
//
// conFactoryRegistry_.destroy(); // No destroy operation defined
conFactoryRegistry_ = null;
//
// Destroy the AccFactoryRegistry
//
// accFactoryRegistry_.destroy(); // No destroy operation defined
accFactoryRegistry_ = null;
//
// Destroy the UnknownExceptionStrategy
//
unknownExceptionStrategy_.destroy();
unknownExceptionStrategy_ = null;
//
// Destroy the Asynchonous message handler
//
asyncHandler_.shutdown();
asyncHandler_ = null;
}
//
// IMPORTANT: Only use this when required by the Java mapping
//
public org.omg.CORBA.ORB getORB() {
return orb_;
}
public int getNativeCs() {
return nativeCs_;
}
public int getNativeWcs() {
return nativeWcs_;
}
public int getDefaultWcs() {
return defaultWcs_;
}
public ObjectFactory getObjectFactory() {
return objectFactory_;
}
public ClientManager getClientManager() {
return clientManager_;
}
public PolicyFactoryManager getPolicyFactoryManager() {
return policyFactoryManager_;
}
public PIManager getPIManager() {
return interceptorManager_;
}
public InitialServiceManager getInitialServiceManager() {
return initServiceManager_;
}
public ValueFactoryManager getValueFactoryManager() {
return valueFactoryManager_;
}
public org.omg.IOP.CodecFactory getCodecFactory() {
return codecFactory_;
}
public org.apache.yoko.orb.OBPortableServer.POAManagerFactory getPOAManagerFactory() {
return pmFactory_;
}
public MultiRequestSender getMultiRequestSender() {
return multiRequestSender_;
}
public java.util.Properties getProperties() {
return properties_;
}
public DispatchStrategyFactory getDispatchStrategyFactory() {
return dispatchStrategyFactory_;
}
public BootManager getBootManager() {
return bootManager_;
}
public Logger getLogger() {
return logger_;
}
public CoreTraceLevels getCoreTraceLevels() {
return coreTraceLevels_;
}
public RecursiveMutex getORBSyncMutex() {
return orbSyncMutex_;
}
public ExecutorService getServerExecutor() {
return serverExecutor_;
}
public Phaser getServerPhaser() {
return serverPhaser;
}
public ExecutorService getClientExecutor() {
return clientExecutor_;
}
public Phaser getClientPhaser() {
return clientPhaser;
}
public org.apache.yoko.orb.OCI.ConFactoryRegistry getConFactoryRegistry() {
return conFactoryRegistry_;
}
public org.apache.yoko.orb.OCI.AccFactoryRegistry getAccFactoryRegistry() {
return accFactoryRegistry_;
}
public UnknownExceptionStrategy getUnknownExceptionStrategy() {
return unknownExceptionStrategy_;
}
public UnknownExceptionStrategy setUnknownExceptionStrategy(
UnknownExceptionStrategy strategy) {
UnknownExceptionStrategy result = unknownExceptionStrategy_;
unknownExceptionStrategy_ = strategy;
return result;
}
public URLRegistry getURLRegistry() {
return urlRegistry_;
}
public String getOrbId() {
return orbId_;
}
public String getServerId() {
return serverId_;
}
public String getServerInstance() {
return serverInstance_;
}
public boolean useTypeCodeCache() {
return useTypeCodeCache_;
}
public boolean extendedWchar() {
return extendedWchar_;
}
public OrbAsyncHandler getAsyncHandler() {
return asyncHandler_;
}
}