diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterFactory.cpp | 22 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 51 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 3 |
3 files changed, 61 insertions, 15 deletions
diff --git a/cpp/src/Ice/ObjectAdapterFactory.cpp b/cpp/src/Ice/ObjectAdapterFactory.cpp index bd1c9152be6..36b88ee695e 100644 --- a/cpp/src/Ice/ObjectAdapterFactory.cpp +++ b/cpp/src/Ice/ObjectAdapterFactory.cpp @@ -11,6 +11,7 @@ #include <Ice/ObjectAdapterI.h> #include <Ice/LocalException.h> #include <Ice/Functional.h> +#include <IceUtil/UUID.h> using namespace std; using namespace Ice; @@ -116,8 +117,25 @@ IceInternal::ObjectAdapterFactory::createObjectAdapter(const string& name, const throw AlreadyRegisteredException(__FILE__, __LINE__, "object adapter", name); } - ObjectAdapterIPtr adapter = new ObjectAdapterI(_instance, _communicator, this, name, endpoints, router); - _adapters.insert(make_pair(name, adapter)); + if(name.empty() && (!name.empty() || router != 0)) + { + InitializationException ex(__FILE__, __LINE__); + ex.reason = "Cannot configure endpoints or router with nameless object adapter"; + throw ex; + } + + ObjectAdapterIPtr adapter; + if(name.empty()) + { + string uuid = IceUtil::generateUUID(); + adapter = new ObjectAdapterI(_instance, _communicator, this, uuid, "", 0, true); + _adapters.insert(make_pair(uuid, adapter)); + } + else + { + adapter = new ObjectAdapterI(_instance, _communicator, this, name, endpoints, router, false); + _adapters.insert(make_pair(name, adapter)); + } return adapter; } diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index a84e7f1eb43..ac6d5262c2a 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -51,7 +51,7 @@ Ice::ObjectAdapterI::getName() const // // No mutex lock necessary, _name is immutable. // - return _name; + return _noConfig ? "" : _name; } CommunicatorPtr @@ -97,8 +97,13 @@ Ice::ObjectAdapterI::activate() _waitForActivate = true; locatorInfo = _locatorInfo; - printAdapterReady = _instance->initializationData().properties->getPropertyAsInt("Ice.PrintAdapterReady") > 0; - registerProcess = _instance->initializationData().properties->getPropertyAsInt(_name + ".RegisterProcess") > 0; + if(!_noConfig) + { + printAdapterReady = + _instance->initializationData().properties->getPropertyAsInt("Ice.PrintAdapterReady") > 0; + registerProcess = + _instance->initializationData().properties->getPropertyAsInt(_name + ".RegisterProcess") > 0; + } } try @@ -671,7 +676,7 @@ Ice::ObjectAdapterI::getServantManager() const Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const CommunicatorPtr& communicator, const ObjectAdapterFactoryPtr& objectAdapterFactory, const string& name, - const string& endpointInfo, const RouterPrx& router) : + const string& endpointInfo, const RouterPrx& router, bool noConfig) : _deactivated(false), _instance(instance), _communicator(communicator), @@ -679,12 +684,34 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica _servantManager(new ServantManager(instance, name)), _activateOneOffDone(false), _name(name), - _id(instance->initializationData().properties->getProperty(name + ".AdapterId")), - _replicaGroupId(instance->initializationData().properties->getProperty(name + ".ReplicaGroupId")), _directCount(0), _waitForActivate(false), - _waitForDeactivate(false) + _waitForDeactivate(false), + _noConfig(noConfig) { + if(_noConfig) + { + return; + } + + // + // Make sure named adapter has some configuration + // + if(endpointInfo.empty() && router == 0) + { + PropertyDict oaProps = instance->initializationData().properties->getPropertiesForPrefix(_name + "."); + if(oaProps.size() == 0) + { + InitializationException ex(__FILE__, __LINE__); + ex.reason = "Object adapter \"" + _name + "\" requires configuration."; + throw ex; + } + } + + const_cast<string&>(_id) = instance->initializationData().properties->getProperty(name + ".AdapterId"); + const_cast<string&>(_replicaGroupId) = + instance->initializationData().properties->getProperty(name + ".ReplicaGroupId"); + __setNoDelete(true); try { @@ -809,12 +836,12 @@ Ice::ObjectAdapterI::~ObjectAdapterI() if(!_deactivated) { Warning out(_instance->initializationData().logger); - out << "object adapter `" << _name << "' has not been deactivated"; + out << "object adapter `" << getName() << "' has not been deactivated"; } else if(_instance) { Warning out(_instance->initializationData().logger); - out << "object adapter `" << _name << "' deactivation had not been waited for"; + out << "object adapter `" << getName() << "' deactivation had not been waited for"; } else { @@ -892,7 +919,7 @@ Ice::ObjectAdapterI::checkForDeactivation() const if(_deactivated) { ObjectAdapterDeactivatedException ex(__FILE__, __LINE__); - ex.name = _name; + ex.name = getName(); throw ex; } } @@ -988,12 +1015,12 @@ ObjectAdapterI::updateLocatorRegistry(const IceInternal::LocatorInfoPtr& locator if(!locatorRegistry) { Warning out(_instance->initializationData().logger); - out << "object adapter `" << _name << "' cannot register the process without a locator registry"; + out << "object adapter `" << getName() << "' cannot register the process without a locator registry"; } else if(serverId.empty()) { Warning out(_instance->initializationData().logger); - out << "object adapter `" << _name << "' cannot register the process without a value for Ice.ServerId"; + out << "object adapter `" << getName() << "' cannot register the process without a value for Ice.ServerId"; } } diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index 2e82ffb2cdd..e90416cadc0 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -85,7 +85,7 @@ private: ObjectAdapterI(const IceInternal::InstancePtr&, const CommunicatorPtr&, const IceInternal::ObjectAdapterFactoryPtr&, const std::string&, const std::string&, - const RouterPrx&); + const RouterPrx&, bool); virtual ~ObjectAdapterI(); friend class IceInternal::ObjectAdapterFactory; @@ -115,6 +115,7 @@ private: int _directCount; // The number of direct proxies dispatching on this object adapter. bool _waitForActivate; bool _waitForDeactivate; + bool _noConfig; class ProcessI : public Process { |