You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2018/05/07 10:03:53 UTC
celix git commit: CELIX-426: Adds bundle activator + example for the
C++ api
Repository: celix
Updated Branches:
refs/heads/feature/CELIX-426-cxx-api 0aee10d80 -> ed32d9f05
CELIX-426: Adds bundle activator + example for the C++ api
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/ed32d9f0
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/ed32d9f0
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/ed32d9f0
Branch: refs/heads/feature/CELIX-426-cxx-api
Commit: ed32d9f058ca664b42f91178fdd65851dae3c042
Parents: 0aee10d
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Mon May 7 12:03:22 2018 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Mon May 7 12:03:22 2018 +0200
----------------------------------------------------------------------
examples/celix-examples/CMakeLists.txt | 2 +
.../bundle_example_cxx/CMakeLists.txt | 28 ++++++++++
.../bundle_example_cxx/src/BundleActivator.cc | 41 +++++++++++++++
framework/include/celix/BundleActivator.h | 49 +++++++++++++++++
framework/include/celix/BundleContext.h | 7 +--
.../include/celix/impl/BundleActivatorImpl.h | 55 ++++++++++++++++++++
.../include/celix/impl/BundleContextImpl.h | 12 +++++
7 files changed, 191 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/examples/celix-examples/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/celix-examples/CMakeLists.txt b/examples/celix-examples/CMakeLists.txt
index 0937cc9..fd2ec1c 100644
--- a/examples/celix-examples/CMakeLists.txt
+++ b/examples/celix-examples/CMakeLists.txt
@@ -21,6 +21,8 @@ else ()
set(EXAMPLES true) #celix_subproject is only available in the celix project -> using examples dir in other project is also supported
endif ()
if (EXAMPLES)
+ add_subdirectory(bundle_example_cxx)
+
add_subdirectory(hello_world)
add_subdirectory(hello_world_test)
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/examples/celix-examples/bundle_example_cxx/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/celix-examples/bundle_example_cxx/CMakeLists.txt b/examples/celix-examples/bundle_example_cxx/CMakeLists.txt
new file mode 100644
index 0000000..a49ca4f
--- /dev/null
+++ b/examples/celix-examples/bundle_example_cxx/CMakeLists.txt
@@ -0,0 +1,28 @@
+# 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.
+
+add_celix_bundle(bundle_example_cxx
+ VERSION 1.0.0
+ SOURCES src/BundleActivator.cc
+)
+
+add_celix_container(bundle_example_cxx_container
+ BUNDLES
+ Celix::shell
+ Celix::shell_tui
+ bundle_example_cxx
+)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/examples/celix-examples/bundle_example_cxx/src/BundleActivator.cc
----------------------------------------------------------------------
diff --git a/examples/celix-examples/bundle_example_cxx/src/BundleActivator.cc b/examples/celix-examples/bundle_example_cxx/src/BundleActivator.cc
new file mode 100644
index 0000000..5687ff0
--- /dev/null
+++ b/examples/celix-examples/bundle_example_cxx/src/BundleActivator.cc
@@ -0,0 +1,41 @@
+/**
+ *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.
+ */
+
+#include <iostream>
+
+#include "celix/BundleActivator.h"
+
+namespace {
+ class BundleActivator : public celix::IBundleActivator {
+ public:
+ BundleActivator(celix::BundleContext &_ctx) : ctx{_ctx} {
+ std::cout << "Hello world from C++ bundle with id " << ctx.getBundle().getBundleId() << std::endl;
+ }
+ virtual ~BundleActivator() {
+ std::cout << "Goodbye world from C++ bundle with id " << ctx.getBundle().getBundleId() << std::endl;
+ }
+ protected:
+ celix::BundleContext &ctx;
+ };
+}
+
+celix::IBundleActivator* celix::createBundleActivator(celix::BundleContext &ctx) {
+ return new BundleActivator{ctx};
+}
+
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/framework/include/celix/BundleActivator.h
----------------------------------------------------------------------
diff --git a/framework/include/celix/BundleActivator.h b/framework/include/celix/BundleActivator.h
new file mode 100644
index 0000000..6809008
--- /dev/null
+++ b/framework/include/celix/BundleActivator.h
@@ -0,0 +1,49 @@
+/**
+ *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.
+ */
+
+#ifndef CXX_CELIX_BUNDLEACTIVATOR_H
+#define CXX_CELIX_BUNDLEACTIVATOR_H
+
+#include "celix/BundleContext.h"
+#include "bundle_activator.h"
+
+
+/**
+ * Note & Warning this is a header implementation of the C bundle activator.
+ * As result this header can only be included ones or the activator symbols will
+ * be duplicate (linking error).
+ */
+
+namespace celix {
+
+ class IBundleActivator {
+ public:
+ IBundleActivator(){};
+ virtual ~IBundleActivator(){};
+ };
+
+ /**
+ * The celix::createBundleActivator which needs to be implemented by a bundle.
+ */
+ static celix::IBundleActivator* createBundleActivator(celix::BundleContext &ctx);
+}
+
+#include "celix/impl/BundleActivatorImpl.h"
+
+#endif //CXX_CELIX_BUNDLEACTIVATOR_H
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/framework/include/celix/BundleContext.h
----------------------------------------------------------------------
diff --git a/framework/include/celix/BundleContext.h b/framework/include/celix/BundleContext.h
index 4169b0a..8fb540d 100644
--- a/framework/include/celix/BundleContext.h
+++ b/framework/include/celix/BundleContext.h
@@ -30,7 +30,9 @@
namespace celix {
- class BundleContext; //forward declaration
+ //forward declarations
+ class Bundle;
+ class BundleContext;
struct BundleRegistrationOptions {
std::string id{};
@@ -191,8 +193,7 @@ namespace celix {
*/
virtual void stopTracker(long trackerId) noexcept = 0;
- //TODO
- //virtual Bundle& getBundle() const noexcept = 0;
+ virtual Bundle& getBundle() noexcept = 0;
//TODO
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/framework/include/celix/impl/BundleActivatorImpl.h
----------------------------------------------------------------------
diff --git a/framework/include/celix/impl/BundleActivatorImpl.h b/framework/include/celix/impl/BundleActivatorImpl.h
new file mode 100644
index 0000000..2a0db53
--- /dev/null
+++ b/framework/include/celix/impl/BundleActivatorImpl.h
@@ -0,0 +1,55 @@
+/**
+ *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.
+ */
+
+
+namespace celix {
+ namespace impl {
+ struct ActivatorData {
+ celix::BundleContext *ctx;
+ celix::IBundleActivator *act;
+ };
+ }
+}
+
+
+extern "C" celix_status_t bundleActivator_create(bundle_context_t *c_ctx, void **userData) {
+ auto *data = new celix::impl::ActivatorData;
+ data->ctx = new celix::impl::BundleContextImpl(c_ctx);
+ *userData = data;
+ return CELIX_SUCCESS;
+}
+
+extern "C" celix_status_t bundleActivator_start(void *userData, bundle_context_t *) {
+ auto *data = static_cast<celix::impl::ActivatorData*>(userData);
+ data->act = celix::createBundleActivator(*data->ctx);
+ return CELIX_SUCCESS;
+}
+
+extern "C" celix_status_t bundleActivator_stop(void *userData, bundle_context_t *) {
+ auto *data = static_cast<celix::impl::ActivatorData*>(userData);
+ delete data->act;
+ return CELIX_SUCCESS;
+}
+
+extern "C" celix_status_t bundleActivator_destroy(void *userData, bundle_context_t*) {
+ auto *data = static_cast<celix::impl::ActivatorData*>(userData);
+ delete data->ctx;
+ delete data;
+ return CELIX_SUCCESS;
+}
http://git-wip-us.apache.org/repos/asf/celix/blob/ed32d9f0/framework/include/celix/impl/BundleContextImpl.h
----------------------------------------------------------------------
diff --git a/framework/include/celix/impl/BundleContextImpl.h b/framework/include/celix/impl/BundleContextImpl.h
index 4bff16c..8bdd5c1 100644
--- a/framework/include/celix/impl/BundleContextImpl.h
+++ b/framework/include/celix/impl/BundleContextImpl.h
@@ -22,6 +22,7 @@
#include <mutex>
#include <cstring>
+#include <memory>
#include "bundle_context.h"
#include "service_tracker.h"
@@ -150,6 +151,16 @@ namespace celix {
return celix_bundleContext_useBundle(this->c_ctx, bundleId, (void*)(&use), c_use);
}
+ Bundle& getBundle() noexcept override {
+ std::lock_guard<std::mutex> lock{this->mutex};
+ if (this->cachedBundle.size() == 0) {
+ celix_bundle_t *c_bnd = nullptr;
+ bundleContext_getBundle(this->c_ctx, &c_bnd);
+ this->cachedBundle.emplace_back(c_bnd);
+ }
+ return this->cachedBundle[0];
+ };
+
protected:
long registerServiceInternal(const std::string &serviceName, void *svc, const std::string &version, const std::string &lang, Properties props = {}) noexcept override {
@@ -294,6 +305,7 @@ namespace celix {
std::mutex mutex{};
std::map<long,std::unique_ptr<TrackEntry>> trackEntries{};
+ std::vector<celix::impl::BundleImpl> cachedBundle{};
};
}
}