diff options
Diffstat (limited to 'sca-cpp/branches/cpp-M1/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp')
-rw-r--r-- | sca-cpp/branches/cpp-M1/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/sca-cpp/branches/cpp-M1/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp b/sca-cpp/branches/cpp-M1/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp new file mode 100644 index 0000000000..9da3e547e9 --- /dev/null +++ b/sca-cpp/branches/cpp-M1/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp @@ -0,0 +1,355 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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. + */ + +/* $Rev$ $Date: 2005/12/22 11:33:21 $ */ + +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/core/ComponentServiceWrapper.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Exceptions.h" + +#include "tuscany/sca/model/System.h" +#include "tuscany/sca/model/Subsystem.h" +#include "tuscany/sca/model/ModelLoader.h" + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#endif + +namespace tuscany +{ + namespace sca + { + /** + * Environment variable names + */ + static const char* TUSCANY_SCACPP = "TUSCANY_SCACPP"; + static const char* TUSCANY_SCACPP_SYSTEM_ROOT = "TUSCANY_SCACPP_SYSTEM_ROOT"; + static const char* TUSCANY_SCACPP_DEFAULT_MODULE = "TUSCANY_SCACPP_DEFAULT_MODULE"; + + + // ========================================================== + // Initialize static class member to not pointing at anything + // ========================================================== + SCARuntime* SCARuntime::instance = 0; + string SCARuntime::systemRoot = ""; + string SCARuntime::defaultModuleName = ""; + + + // ========================================================== + // Set the system configuration root + // ========================================================== + void SCARuntime::setSystemRoot(const string& root) + { + LOGENTRY(1, "SCARuntime::"); + systemRoot = root; + LOGINFO_1(3, "SCARuntime::setSystemRoot - set to %s", root.c_str()); + LOGEXIT(1, "SCARuntime::setSystemRoot"); + } + + // ========================================================== + // Set the default ModuleComponent name + // ========================================================== + void SCARuntime::setDefaultModuleComponent(const string& moduleComponent) + { + LOGENTRY(1, "SCARuntime::setDefaultModuleComponent"); + defaultModuleName = moduleComponent; + LOGINFO_1(3, "SCARuntime::setDefaultModuleComponent - set to %s", moduleComponent.c_str()); + LOGEXIT(1, "SCARuntime::setDefaultModuleComponent"); + } + + // =================================================================== + // Constructor for the SCARuntime class. This will be a singleton that + // holds all the information about the current runtime. + // =================================================================== + SCARuntime::SCARuntime() : system(new System()), defaultModule(0) + { + LOGENTRY(1, "SCARuntime::constructor"); + + // Locate the SCA install root + char* root = 0; + root = getenv(TUSCANY_SCACPP); + if (root == 0) + { + string msg = TUSCANY_SCACPP; + msg += " environment variable not set"; + throw SystemConfigurationException(msg.c_str()); + } + else + { + SCARoot = root; + } + + LOGEXIT(1, "SCARuntime::constructor"); + } + + // =================================================================== + // Destructor for the SCARuntime class. + // =================================================================== + SCARuntime::~SCARuntime() + { + LOGENTRY(1, "SCARuntime::destructor"); + + if (system) + { + delete system; + } + + LOGEXIT(1, "SCARuntime::destructor"); + } + + // ============================================================= + // Get the instance of the runtime, creates it if does not exist + // static method + // ============================================================= + SCARuntime* SCARuntime::getInstance() + { + LOGENTRY(1, "SCARuntime::getInstance"); + + if (instance == NULL) + { + instance = new SCARuntime(); + + if (systemRoot == "") + { + + // Load the runtime + // Get root from environment variable TUSCANY_SCACPP_SYSTEM_ROOT + char* systemRootEnv = getenv(TUSCANY_SCACPP_SYSTEM_ROOT); + if (systemRootEnv == 0) + { + string msg = TUSCANY_SCACPP_SYSTEM_ROOT; + msg += " environment variable not set"; + throw SystemConfigurationException(msg.c_str()); + } + + systemRoot = systemRootEnv; + } + + instance->load(systemRoot); + } + + LOGEXIT(1, "SCARuntime::getInstance"); + + return instance; + + } + + + // ============================================================= + // Release the instance of the runtime. + // ============================================================= + void SCARuntime::releaseInstance() + { + LOGENTRY(1, "SCARuntime::releaseInstance"); + + if (instance) + { + delete instance; + instance = 0; + systemRoot = ""; + defaultModuleName = ""; + } + + LOGEXIT(1, "SCARuntime::releaseInstance"); + } + + // ====================================== + // Load up all the details of the runtime + // ====================================== + void SCARuntime::load(const string& configurationRoot) + { + LOGENTRY(1, "SCARuntime::load"); + + LOGINFO_1(2,"configuration root: %s", configurationRoot.c_str()); + + ModelLoader loader(system); + // Load details of the module + loader.load(configurationRoot); + + LOGEXIT(1, "SCARuntime::load"); + } + + + // =================================== + // Return the top of the runtime model + // =================================== + System* SCARuntime::getSystem() + { + return system; + } + + + // =================================================== + // setCurrentComponent: push component for this thread + // =================================================== + void SCARuntime::setCurrentComponent(Component* component) + { + +#if defined(WIN32) || defined (_WINDOWS) + DWORD currentThreadId = GetCurrentThreadId(); +#else + pthread_t currentThreadId = pthread_self(); +#endif + COMPONENTS_MAP::iterator iter = components.find(currentThreadId); + if (iter == components.end()) + { + components[currentThreadId] = COMPONENT_STACK(); + iter = components.find(currentThreadId); + } + + COMPONENT_STACK& compStack = iter->second; + compStack.push(component); + } + + + // ==================================================== + // unsetCurrentComponent: pop component for this thread + // ==================================================== + Component* SCARuntime::unsetCurrentComponent() + { +#if defined(WIN32) || defined (_WINDOWS) + DWORD currentThreadId = GetCurrentThreadId(); +#else + pthread_t currentThreadId = pthread_self(); +#endif + + COMPONENTS_MAP::iterator iter = components.find(currentThreadId); + if (iter != components.end()) + { + COMPONENT_STACK& compStack = iter->second; + if (compStack.size() > 0) + { + Component* component = compStack.top(); + compStack.pop(); + return component; + } + } + + return 0; + } + + // ============================================================= + // getCurrentComponent: return current component for this thread + // ============================================================= + Component* SCARuntime::getCurrentComponent() + { +#if defined(WIN32) || defined (_WINDOWS) + DWORD currentThreadId = GetCurrentThreadId(); +#else + pthread_t currentThreadId = pthread_self(); +#endif + + COMPONENTS_MAP::iterator iter = components.find(currentThreadId); + if (iter == components.end()) + { + components[currentThreadId] = COMPONENT_STACK(); + iter = components.find(currentThreadId); + } + + COMPONENT_STACK& compStack = iter->second; + if (compStack.size() > 0) + { + return compStack.top(); + } + else + { + return 0; + } + + } + + + // =========================================== + // getCurrentModule: return the current module + // =========================================== + Module* SCARuntime::getCurrentModule() + { + // --------------------------------------------- + // Get module from current component if possible + // --------------------------------------------- + Component* comp = getCurrentComponent(); + if (comp != 0) + { + return comp->getModule(); + } + + // ---------------------- + // Get the default Module + // ---------------------- + string message; + if (!defaultModule) + { + // ------------------------------------------- + // Get the default module from the environment + // ------------------------------------------- + if (defaultModuleName == "") + { + const char* defMod = getenv(TUSCANY_SCACPP_DEFAULT_MODULE); + if (!defMod) + { + message = TUSCANY_SCACPP_DEFAULT_MODULE; + message += " environment variable not set"; + throw SystemConfigurationException(message.c_str()); + } + defaultModuleName = defMod; + } + string subsystemName, moduleName; + Utils::tokeniseUri(defaultModuleName, subsystemName, moduleName); + + // --------------------------- + // Subsystem must be specified + // --------------------------- + Subsystem* subsystem = system->findSubsystem(subsystemName); + if (!subsystem) + { + message = "Default subsystem \'" + subsystemName + "\' not found"; + throw SystemConfigurationException(message.c_str()); + } + + // -------------------------------------------------------------------------- + // If module is not specified then get the default module for this subsystem. + // This will be the ONLY module for this subsystem + // -------------------------------------------------------------------------- + if (moduleName == "") + { + defaultModule = subsystem->getDefaultModule(); + if (!defaultModule) + { + message = "Default module not found for subsystem \'" + subsystemName + "\'"; + throw SystemConfigurationException(message.c_str()); + } + } + else + { + // ----------------------------- + // get the named ModuleComponent + // ----------------------------- + defaultModule = subsystem->findModuleByComponentName(moduleName); + if (!defaultModule) + { + message = "Default module \'" + moduleName + "\' not found in subsystem \'" + subsystemName +"\'"; + throw SystemConfigurationException(message.c_str()); + } + } + } + return defaultModule; + } + + } // End namespace sca +} // End namespace tuscany |