diff options
author | Benoit Foucher <benoit@zeroc.com> | 2004-06-02 21:17:40 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2004-06-02 21:17:40 +0000 |
commit | c209ff436f4268b8db689a2dd17615456eea78ce (patch) | |
tree | 5feb8607988706851bfdfdd5ba2d3924ba5b8f6c /cpp/src/IcePack/ServerBuilder.cpp | |
parent | Fixed to AMD code generation. (diff) | |
download | ice-c209ff436f4268b8db689a2dd17615456eea78ce.tar.bz2 ice-c209ff436f4268b8db689a2dd17615456eea78ce.tar.xz ice-c209ff436f4268b8db689a2dd17615456eea78ce.zip |
Merged icepack_refactoring2_branch, many IcePack changes.
Diffstat (limited to 'cpp/src/IcePack/ServerBuilder.cpp')
-rw-r--r-- | cpp/src/IcePack/ServerBuilder.cpp | 710 |
1 files changed, 0 insertions, 710 deletions
diff --git a/cpp/src/IcePack/ServerBuilder.cpp b/cpp/src/IcePack/ServerBuilder.cpp deleted file mode 100644 index 3747926f79a..00000000000 --- a/cpp/src/IcePack/ServerBuilder.cpp +++ /dev/null @@ -1,710 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2004 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#include <IceUtil/UUID.h> -#include <Ice/Ice.h> -#include <IcePack/ServerBuilder.h> -#include <IcePack/ServiceBuilder.h> -#include <IcePack/AdapterFactory.h> -#include <IcePack/ServerFactory.h> - -#include <iterator> - -using namespace std; -using namespace IcePack; - -namespace IcePack -{ - -// -// Server registration task. -// -class RegisterServerTask : public Task -{ -public: - - RegisterServerTask(const ServerRegistryPrx& registry, const string& name, const ServerBuilder& builder) : - _registry(registry), - _name(name), - _builder(builder) - { - } - - virtual void - execute() - { - try - { - _registry->add(_name, _builder.getServer()); - } - catch(const ServerExistsException& lex) - { - ostringstream os; - os << "couldn't add the server to the registry:\n" << lex; - - ServerDeploymentException ex; - ex.server = _name; - ex.reason = os.str(); - throw ex; - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't contact the server registry:\n" << lex << endl; - - ServerDeploymentException ex; - ex.server = _name; - ex.reason = os.str(); - throw ex; - } - } - - virtual void - undo() - { - try - { - _registry->remove(_name); - } - catch(const ServerNotExistException& lex) - { - ostringstream os; - os << "couldn't remove the server from the registry:\n" << lex; - - ServerDeploymentException ex; - ex.server = _name; - ex.reason = os.str(); - throw ex; - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't contact the server registry:\n" << lex; - - ServerDeploymentException ex; - ex.server = _name; - ex.reason = os.str(); - throw ex; - } - } - -private: - - ServerRegistryPrx _registry; - string _name; - const ServerBuilder& _builder; -}; - -// -// Adapter registration task. -// -class RegisterServerAdapterTask : public Task -{ -public: - - RegisterServerAdapterTask(const AdapterRegistryPrx& registry, const string& id, const ServerBuilder& builder) : - _registry(registry), - _id(id), - _builder(builder) - { - } - - virtual void - execute() - { - try - { - _registry->add(_id, _builder.getServerAdapter(_id)); - } - catch(const AdapterExistsException& lex) - { - ostringstream os; - os << "couldn't add the adapter to the registry:\n" << lex; - - AdapterDeploymentException ex; - ex.id = _id; - ex.reason = os.str(); - throw ex; - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't contact the adapter registry: " << lex << endl; - - AdapterDeploymentException ex; - ex.id = _id; - ex.reason = os.str(); - throw ex; - } - } - - virtual void - undo() - { - try - { - _registry->remove(_id); - } - catch(const AdapterNotExistException& lex) - { - ostringstream os; - os << "couldn't remove the adapter from the registry:\n" << lex; - - AdapterDeploymentException ex; - ex.id = _id; - ex.reason = os.str(); - throw ex; - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't contact the adapter registry:\n" << lex; - - AdapterDeploymentException ex; - ex.id = _id; - ex.reason = os.str(); - throw ex; - } - } - -private: - - AdapterRegistryPrx _registry; - string _id; - const ServerBuilder& _builder; -}; - -// -// Server builder handler. -// -class ServerHandler : public ComponentHandler -{ -public: - - ServerHandler(ServerBuilder&); - - virtual void startElement(const string&, const IceXML::Attributes&, int, int); - virtual void endElement(const string&, int, int); - -private: - - ServerBuilder& _builder; -}; - -} - -IcePack::ServerHandler::ServerHandler(ServerBuilder& builder) : - ComponentHandler(builder), - _builder(builder) -{ - // - // Create top level directory and configuration directory. - // - _builder.createDirectory(""); - _builder.createDirectory("/config"); - _builder.registerServer(); -} - -void -IcePack::ServerHandler::startElement(const string& name, const IceXML::Attributes& attrs, int line, int column) -{ - ComponentHandler::startElement(name, attrs, line, column); - if(!isCurrentTargetDeployable()) - { - return; - } - - if(name == "server") - { - string basedir = getAttributeValueWithDefault(attrs, "basedir", ""); - if(!basedir.empty()) - { - _builder.overrideBaseDir(basedir); - } - - string kind = getAttributeValue(attrs, "kind"); - if(kind == "cpp") - { - _builder.setKind(ServerBuilder::ServerKindCppServer); - _builder.createConfigFile("/config/config_server"); - } - else if(kind == "java") - { - _builder.setKind(ServerBuilder::ServerKindJavaServer); - _builder.createConfigFile("/config/config_server"); - } - else if(kind == "cpp-icebox") - { - _builder.setKind(ServerBuilder::ServerKindCppIceBox); - _builder.createConfigFile("/config/config_icebox"); - _builder.createDirectory("/dbs"); - - // - // TODO: is the server name a good category? - // - _builder.addProperty("IceBox.ServiceManager.Identity", _builder.substitute("${name}/ServiceManager")); - - _builder.registerAdapter("IceBox.ServiceManager", - getAttributeValue(attrs, "endpoints"), true, - _builder.getDefaultAdapterId("IceBox.ServiceManager")); - } - else if(kind == "java-icebox") - { - _builder.setKind(ServerBuilder::ServerKindJavaIceBox); - _builder.createConfigFile("/config/config_icebox"); - _builder.createDirectory("/dbs"); - - // - // TODO: is the server name a good category? - // - _builder.addProperty("IceBox.ServiceManager.Identity", _builder.substitute("${name}/ServiceManager")); - - _builder.registerAdapter("IceBox.ServiceManager", - getAttributeValue(attrs, "endpoints"), true, - _builder.getDefaultAdapterId("IceBox.ServiceManager")); - } - } - else if(name == "service") - { - string serviceName = getAttributeValue(attrs, "name"); - string descriptor = getAttributeValue(attrs, "descriptor"); - string targets = getAttributeValueWithDefault(attrs, "targets", ""); - _builder.addService(serviceName, descriptor, targets); - } - else if(name == "adapter") - { - assert(!_currentAdapterId.empty()); - string adapterName = getAttributeValue(attrs, "name"); - bool registerProcess = getAttributeValueWithDefault(attrs, "register", "false") == "true"; - _builder.registerAdapter(adapterName, getAttributeValue(attrs, "endpoints"), registerProcess, - _currentAdapterId); - } -} - -void -IcePack::ServerHandler::endElement(const string& name, int line, int column) -{ - if(isCurrentTargetDeployable()) - { - if(name == "classname") - { - _builder.setClassName(elementValue()); - } - else if(name == "pwd") - { - _builder.setWorkingDirectory(elementValue()); - } - else if(name == "option") - { - _builder.addOption(elementValue()); - } - else if(name == "vm-option") - { - _builder.addJavaOption(elementValue()); - } - else if(name == "env") - { - _builder.addEnvVar(elementValue()); - } - } - - ComponentHandler::endElement(name, line, column); -} - -IcePack::ServerBuilder::ServerBuilder(const NodeInfoPtr& nodeInfo, - const map<string, string>& variables, - const vector<string>& targets) : - ComponentBuilder(nodeInfo->getCommunicator(), variables, targets), - _nodeInfo(nodeInfo) -{ - assert(_variables.back().find("parent") != _variables.back().end()); - assert(_variables.back().find("name") != _variables.back().end()); - assert(_variables.back().find("fqn") != _variables.back().end()); - assert(_variables.back().find("datadir") != _variables.back().end()); - assert(_variables.back().find("binpath") != _variables.back().end()); - assert(_variables.back().find("libpath") != _variables.back().end()); - - // - // Required for the component builder. - // - _objectRegistry = _nodeInfo->getObjectRegistry(); - - // - // Begin to populate the server description. - // - _description.name = getVariable("name"); - _description.path = getVariable("binpath"); - _libraryPath = getVariable("libpath"); - _description.node = nodeInfo->getNode()->getName(); - _description.targets = targets; -} - -void -IcePack::ServerBuilder::parse(const std::string& descriptor) -{ - ServerHandler handler(*this); - - // - // Parse the deployment descriptor. - // - ComponentBuilder::parse(descriptor, handler); - - // - // Once everything is parsed, we can perform some final setup - // before the deployment starts. - // - _description.descriptor = descriptor; - - Ice::PropertiesPtr props = _nodeInfo->getCommunicator()->getProperties(); - _properties->setProperty("Ice.ProgramName", getVariable("name")); - - if(_kind == ServerKindJavaServer || _kind == ServerKindJavaIceBox) - { - if(!_libraryPath.empty()) - { - _javaOptions.push_back("-classpath"); - _javaOptions.push_back(_libraryPath); - } - _javaOptions.push_back("-ea"); - _javaOptions.push_back(_className); - - for(vector<string>::reverse_iterator p = _javaOptions.rbegin(); p != _javaOptions.rend(); ++p) - { - _description.args.insert(_description.args.begin(), *p); - } - } - - if(_kind == ServerKindCppIceBox || _kind == ServerKindJavaIceBox) - { - ostringstream os; - copy(_serviceNames.begin(), _serviceNames.end(), ostream_iterator<string>(os," ")); - addProperty("IceBox.LoadOrder", os.str()); - } - - _description.args.push_back("--Ice.Config=" + _configFile); -} - -void -IcePack::ServerBuilder::execute() -{ - // - // Creates the server from _description and the server adapters - // listed in _serverAdapterIds. The adapter proxies are returned - // in _serverAdapters. - // - try - { - _server = _nodeInfo->getServerFactory()->createServerAndAdapters(_description, - _serverAdapterIds, - _serverAdapters); - } - catch(const Freeze::DatabaseException& lex) - { - ostringstream os; - os << "couldn't create the server: " << lex.message << ":" << endl; - os << lex; - - ServerDeploymentException ex; - ex.server = _description.name; - ex.reason = os.str(); - throw ex; - } - - // - // Deploy the server components. If something goes wrong it's our - // responsability to destroy the server object. Note: destroying - // the server object will also destroy the server adapters. - // - try - { - ComponentBuilder::execute(); - } - catch(const DeploymentException& ex) - { - _server->destroy(); - throw ex; - } -} - -void -IcePack::ServerBuilder::undo() -{ - if(!_server) - { - ServerRegistryPrx registry = _nodeInfo->getServerRegistry(); - if(registry) - { - try - { - _server = registry->findByName(_description.name); - } - catch(const ServerNotExistException&) - { - ostringstream os; - os << "couldn't find server in the registry"; - - ServerDeploymentException ex; - ex.server = _description.name; - ex.reason = os.str(); - throw ex; - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't contact the server registry:\n" << lex; - - ServerDeploymentException ex; - ex.server = _description.name; - ex.reason = os.str(); - throw ex; - } - } - } - - // - // Set the server activation mode to manual (to avoid it to be - // restarted on demand) and stop it before removing its - // components. - // - _server->setActivationMode(Manual); - _server->stop(); - - // - // Remove all the server components. - // - ComponentBuilder::undo(); - - try - { - _server->destroy(); - } - catch(const Ice::LocalException& lex) - { - ostringstream os; - os << "couldn't destroy the server:\n" << lex; - - ServerDeploymentException ex; - ex.server = _description.name; - ex.reason = os.str(); - throw ex; - } -} - -void -IcePack::ServerBuilder::setClassName(const string& name) -{ - if(_kind != ServerKindJavaServer) - { - throw IceXML::ParserException(__FILE__, __LINE__, "classname element only allowed for Java servers"); - } - - if(name.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "empty classname element value"); - } - - _className = name; -} - -void -IcePack::ServerBuilder::setWorkingDirectory(const string& pwd) -{ - if(pwd.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "no working directory"); - } - - _description.pwd = pwd; -} - -void -IcePack::ServerBuilder::registerServer() -{ - _tasks.push_back(new RegisterServerTask(_nodeInfo->getServerRegistry(), getVariable("name"), *this)); -} - -void -IcePack::ServerBuilder::registerAdapter(const string& name, const string& endpoints, bool registerProcess, - const string& adapterId) -{ - AdapterRegistryPrx adapterRegistry = _nodeInfo->getAdapterRegistry(); - if(!adapterRegistry) - { - throw IceXML::ParserException(__FILE__, __LINE__, "IcePack is not configured to register adapters"); - } - - if(name.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "empty adapter name"); - } - if(endpoints.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "empty adapter endpoints"); - } - if(adapterId.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "empty adapter id"); - } - - // - // A server adapter object will be created with the server when - // the server is created (see ServerBuilder::execute() - // method). The RegisterServerAdapter task will get the server - // adapter proxy through the builder method getServerAdapter(). - // - _serverAdapterIds.push_back(adapterId); - _tasks.push_back(new RegisterServerAdapterTask(adapterRegistry, adapterId, *this)); - - // - // Generate adapter configuration properties. - // - addProperty(name + ".Endpoints", endpoints); - addProperty(name + ".AdapterId", adapterId); - if(registerProcess) - { - addProperty(name + ".RegisterProcess", "1"); - } -} - -void -IcePack::ServerBuilder::addService(const string& name, const string& descriptor, const string& additionalTargets) -{ - if(_kind != ServerKindCppIceBox && _kind != ServerKindJavaIceBox) - { - throw IceXML::ParserException(__FILE__, __LINE__, "services are only allowed in IceBox servers"); - } - - if(name.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "name attribute value is empty"); - } - if(descriptor.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "descriptor attribute value is empty"); - } - - // - // Setup new variables for the service, overides the name value. - // - std::map<std::string, std::string> variables; - vector< map< string, string> >::reverse_iterator p = _variables.rbegin(); - while(p != _variables.rend()) - { - variables.insert(p->begin(), p->end()); - ++p; - } - - variables["parent"] = getVariable("name"); - variables["name"] = name; - variables["fqn"] = getVariable("fqn") + "." + name; - - vector<string> targets = toTargets(additionalTargets); - copy(_targets.begin(), _targets.end(), back_inserter(targets)); - - ServiceBuilder* task = new ServiceBuilder(_nodeInfo, *this, variables, targets); - TaskPtr t = task; - task->parse(toLocation(descriptor)); - _tasks.push_back(t); - - _serviceNames.push_back(name); -} - -void -IcePack::ServerBuilder::addOption(const string& option) -{ - _description.args.push_back(option); -} - -void -IcePack::ServerBuilder::addJavaOption(const string& option) -{ - _javaOptions.push_back(option); -} - -void -IcePack::ServerBuilder::addEnvVar(const string& env) -{ - _description.envs.push_back(env); -} - -void -IcePack::ServerBuilder::setKind(ServerBuilder::ServerKind kind) -{ - switch(kind) - { - case ServerKindCppServer: - { - if(_description.path.empty()) - { - throw IceXML::ParserException(__FILE__, __LINE__, "C++ server path is not specified"); - } - break; - } - case ServerKindJavaServer: - { - if(_description.path.empty()) - { - _description.path = "java"; - } - break; - } - case ServerKindJavaIceBox: - { - if(_description.path.empty()) - { - _description.path = "java"; - } - - _description.serviceManager = IceBox::ServiceManagerPrx::uncheckedCast( - _nodeInfo->getCommunicator()->stringToProxy( - getVariable("name") + "/ServiceManager @ IceBox.ServiceManager-" + getVariable("name"))); - - _className = "IceBox.Server"; - - break; - } - case ServerKindCppIceBox: - { - if(_description.path.empty()) - { - _description.path = "icebox"; - } - - _description.serviceManager = IceBox::ServiceManagerPrx::uncheckedCast( - _nodeInfo->getCommunicator()->stringToProxy( - getVariable("name") + "/ServiceManager @ IceBox.ServiceManager-" + getVariable("name"))); - - break; - } - } - - _kind = kind; -} - -ServerPrx -IcePack::ServerBuilder::getServer() const -{ - assert(_server); - return _server; -} - -ServerAdapterPrx -IcePack::ServerBuilder::getServerAdapter(const std::string& id) const -{ - map<string, ServerAdapterPrx>::const_iterator p = _serverAdapters.find(id); - if(p != _serverAdapters.end()) - { - return p->second; - } - else - { - assert(false); - return 0; // Keep the compiler happy. - } -} |