summaryrefslogtreecommitdiffstats
path: root/sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp')
-rw-r--r--sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp487
1 files changed, 487 insertions, 0 deletions
diff --git a/sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp b/sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp
new file mode 100644
index 0000000000..49ec646bb1
--- /dev/null
+++ b/sca-cpp/tags/cpp-1.0-incubating-M2-final/sca/runtime/core/src/tuscany/sca/core/SCARuntime.cpp
@@ -0,0 +1,487 @@
+/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+#include "tuscany/sca/core/SCARuntime.h"
+#include "tuscany/sca/util/Logging.h"
+#include "tuscany/sca/util/Utils.h"
+#include "tuscany/sca/model/ModelLoader.h"
+#include "tuscany/sca/util/File.h"
+#include "tuscany/sca/util/Exceptions.h"
+#include "tuscany/sca/model/Composite.h"
+#include "tuscany/sca/model/Component.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_COMPONENT = "TUSCANY_SCACPP_DEFAULT_COMPONENT";
+
+ static const char* TUSCANY_SCACPP_ROOT = "TUSCANY_SCACPP_ROOT";
+ static const char* TUSCANY_SCACPP_COMPONENT = "TUSCANY_SCACPP_COMPONENT";
+ static const char* TUSCANY_SCACPP_PATH = "TUSCANY_SCACPP_PATH";
+
+ // ==========================================================
+ // Initialize static class member to not pointing at anything
+ // ==========================================================
+ SCARuntime* SCARuntime::instance = 0;
+ string SCARuntime::systemRoot = "";
+ string SCARuntime::systemPath = "";
+ string SCARuntime::defaultComponentName = "";
+
+
+ // ==========================================================
+ // Set the system configuration root
+ // ==========================================================
+ void SCARuntime::setSystemRoot(const string& root)
+ {
+ LOGENTRY(1, "SCARuntime::setSystemRoot");
+ systemRoot = root;
+ LOGINFO_1(3, "SCARuntime::setSystemRoot - set to %s", root.c_str());
+ LOGEXIT(1, "SCARuntime::setSystemRoot");
+ }
+
+ // ==========================================================
+ // Set the system configuration root
+ // ==========================================================
+ void SCARuntime::setSystemPath(const string& path)
+ {
+ LOGENTRY(1, "SCARuntime::setSystemPath");
+ systemPath = path;
+ LOGINFO_1(3, "SCARuntime::setSystemPath - set to %s", path.c_str());
+ LOGEXIT(1, "SCARuntime::setSystemPath");
+ }
+
+ // ==========================================================
+ // Set the default component name
+ // ==========================================================
+ void SCARuntime::setDefaultComponentName(const string& componentName)
+ {
+ LOGENTRY(1, "SCARuntime::setDefaultComponentName");
+ defaultComponentName = componentName;
+ LOGINFO_1(3, "SCARuntime::setDefaultComponentName - set to %s", componentName.c_str());
+ LOGEXIT(1, "SCARuntime::setDefaultComponentName");
+ }
+
+ // ===================================================================
+ // Constructor for the SCARuntime class. This will be a singleton that
+ // holds all the information about the current runtime.
+ // ===================================================================
+ SCARuntime::SCARuntime() : system(0), defaultComponent(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();
+
+ // load extensions
+ instance->loadExtensions();
+
+ if (systemRoot == "")
+ {
+ // Get root from environment variable TUSCANY_SCACPP_ROOT
+ char* systemRootEnv = getenv(TUSCANY_SCACPP_ROOT);
+ if (systemRootEnv == 0)
+ {
+ // Get root from environment variable TUSCANY_SCACPP_SYSTEM_ROOT
+ systemRootEnv = getenv(TUSCANY_SCACPP_SYSTEM_ROOT);
+ }
+ if (systemRootEnv == 0)
+ {
+ string msg = TUSCANY_SCACPP_ROOT;
+ msg += " environment variable not set";
+ throw SystemConfigurationException(msg.c_str());
+ }
+
+ systemRoot = systemRootEnv;
+ }
+ if (systemPath == "")
+ {
+
+ // Get system path from environment variable TUSCANY_SCACPP_PATH
+ char* systemPathEnv = getenv(TUSCANY_SCACPP_PATH);
+ if (systemPathEnv == 0)
+ {
+ // Make the path optional for now
+// string msg = TUSCANY_SCACPP_PATH;
+// msg += " environment variable not set";
+// throw SystemConfigurationException(msg.c_str());
+ }
+ else
+ {
+ systemPath = systemPathEnv;
+ }
+ }
+ }
+
+ 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 = "";
+ systemPath = "";
+ defaultComponentName = "";
+ }
+
+ LOGEXIT(1, "SCARuntime::releaseInstance");
+ }
+
+ // ======================================
+ // Load up all the details of the runtime
+ // ======================================
+ void SCARuntime::load()
+ {
+ LOGENTRY(1, "SCARuntime::load");
+
+ LOGINFO_1(2,"configuration root: %s", systemRoot.c_str());
+ LOGINFO_1(2,"configuration path: %s", systemPath.c_str());
+
+ // Load the system composite
+ ModelLoader loader(system);
+ loader.load(systemRoot, systemPath);
+
+ LOGEXIT(1, "SCARuntime::load");
+ }
+
+
+ // ======================================
+ // Load up extensions to the runtime
+ // ======================================
+ void SCARuntime::loadExtensions()
+ {
+ LOGENTRY(1, "SCARuntime::loadExtensions");
+
+ string extensionsRoot = SCARoot + "/extensions";
+
+#if defined(WIN32) || defined (_WINDOWS)
+ string pattern = "*.dll";
+#else
+ string pattern = "*.so";
+#endif
+
+ Files files(extensionsRoot, pattern, true);
+ for (unsigned int i=0; i < files.size(); i++)
+ {
+ try
+ {
+ Library lib = Library( files[i].getDirectory() + "/" + files[i].getFileName());
+ extensionsList.push_back(lib);
+ TUSCANY_IMPLEMENTATION_EXTENSION_INITIALIZE extension =
+ (TUSCANY_IMPLEMENTATION_EXTENSION_INITIALIZE)lib.getSymbol("tuscany_sca_extension_initialize");
+ if (extension)
+ {
+ extension();
+ }
+ }
+ catch (TuscanyRuntimeException& ex)
+ {
+ LOGERROR_3(0, "SCARuntime::loadExtensions failed to load extension library: %s: %s: %s",
+ files[i].getFileName().c_str(), ex.getEClassName(), ex.getMessageText());
+ }
+ }
+
+ LOGEXIT(1, "SCARuntime::loadExtensions");
+ }
+
+
+ // ======================================
+ // register an interfaceExtension
+ // ======================================
+ void SCARuntime::registerInterfaceExtension(InterfaceExtension* extension)
+ {
+ LOGENTRY(1, "SCARuntime::registerInterfaceExtension");
+ if (extension)
+ {
+ interfaceExtensions[extension->getExtensionTypeQName()] = extension;
+ }
+ LOGEXIT(1, "SCARuntime::registerInterfaceExtension");
+ }
+
+ // ======================================
+ // find an InterfaceExtension
+ // ======================================
+ InterfaceExtension* SCARuntime::getInterfaceExtension(const string& extensionTypeQName)
+ {
+ return interfaceExtensions[extensionTypeQName];
+ }
+
+ // ======================================
+ // register an implementationExtension
+ // ======================================
+ void SCARuntime::registerImplementationExtension(ImplementationExtension* extension)
+ {
+ LOGENTRY(1, "SCARuntime::registerImplementationExtension");
+ if (extension)
+ {
+ implementationExtensions[extension->getExtensionTypeQName()] = extension;
+ }
+ LOGEXIT(1, "SCARuntime::registerImplementationExtension");
+ }
+
+ // ======================================
+ // find an implementationExtension
+ // ======================================
+ ImplementationExtension* SCARuntime::getImplementationExtension(const string& extensionTypeQName)
+ {
+ return implementationExtensions[extensionTypeQName];
+ }
+
+ // ======================================
+ // register a referenceBindingExtension
+ // ======================================
+ void SCARuntime::registerReferenceBindingExtension(ReferenceBindingExtension* extension)
+ {
+ LOGENTRY(1, "SCARuntime::registerReferenceBindingExtension");
+ if (extension)
+ {
+ referenceBindingExtensions[extension->getExtensionTypeQName()] = extension;
+ }
+ LOGEXIT(1, "SCARuntime::registerReferenceBindingExtension");
+ }
+
+ // ======================================
+ // find a referenceBindingExtension
+ // ======================================
+ ReferenceBindingExtension* SCARuntime::getReferenceBindingExtension(const string& extensionTypeQName)
+ {
+ return referenceBindingExtensions[extensionTypeQName];
+ }
+
+ // ======================================
+ // register a serviceBindingExtension
+ // ======================================
+ void SCARuntime::registerServiceBindingExtension(ServiceBindingExtension* extension)
+ {
+ LOGENTRY(1, "SCARuntime::registerServiceBindingExtension");
+ if (extension)
+ {
+ serviceBindingExtensions[extension->getExtensionTypeQName()] = extension;
+ }
+ LOGEXIT(1, "SCARuntime::registerServiceBindingExtension");
+ }
+
+ // ======================================
+ // find a serviceBindingExtension
+ // ======================================
+ ServiceBindingExtension* SCARuntime::getServiceBindingExtension(const string& extensionTypeQName)
+ {
+ return serviceBindingExtensions[extensionTypeQName];
+ }
+
+
+ // ===================================
+ // Return the top of the runtime model
+ // ===================================
+ Composite* SCARuntime::getSystem()
+ {
+ if (!system)
+ {
+ system = new Composite("tuscany/sca/system", "");
+ load();
+ }
+ 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;
+ }
+
+ }
+
+ // ===========================================
+ // getCurrentCompositeComponent: return the current composite component
+ // ===========================================
+ Component* SCARuntime::getDefaultComponent()
+ {
+
+ // ----------------------
+ // Get the default Component
+ // ----------------------
+ if (!defaultComponent)
+ {
+ // -------------------------------------------
+ // Get the default component name from the environment
+ // -------------------------------------------
+ if (defaultComponentName == "")
+ {
+ const char* defComp = getenv(TUSCANY_SCACPP_COMPONENT);
+ if (!defComp)
+ {
+ defComp = getenv(TUSCANY_SCACPP_DEFAULT_COMPONENT);
+ }
+ if (!defComp)
+ {
+ string message = TUSCANY_SCACPP_COMPONENT;
+ message += " environment variable not set";
+ throw SystemConfigurationException(message.c_str());
+ }
+ defaultComponentName = defComp;
+ }
+
+ defaultComponent = getSystem()->findComponent(defaultComponentName);
+ if (!defaultComponent)
+ {
+ string message = "Component \'" + defaultComponentName + "\' not found";
+ throw SystemConfigurationException(message.c_str());
+ }
+ }
+ return defaultComponent;
+ }
+
+ } // End namespace sca
+} // End namespace tuscany