You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2016/01/28 12:36:55 UTC
celix git commit: CELIX-236: add dependency manager code to celix
bootstrap, add project deployment
Repository: celix
Updated Branches:
refs/heads/develop 4228b9971 -> 37010fbe6
CELIX-236: add dependency manager code to celix bootstrap, add project deployment
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/37010fbe
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/37010fbe
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/37010fbe
Branch: refs/heads/develop
Commit: 37010fbe6249692a9d38175a618ca61204478a11
Parents: 4228b99
Author: Bjoern Petri <bp...@apache.org>
Authored: Thu Jan 28 12:35:29 2016 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Thu Jan 28 12:35:29 2016 +0100
----------------------------------------------------------------------
celix-bootstrap/celix/bootstrap/generators.py | 19 +-
.../bootstrap/templates/bundle/CMakeLists.txt | 15 +-
.../bootstrap/templates/bundle/bundle.yaml | 62 ++-
.../templates/bundle/bundle_activator.c | 527 ++++---------------
.../bootstrap/templates/bundle/component.c | 276 +++++-----
.../bootstrap/templates/bundle/component.h | 84 +--
.../bootstrap/templates/bundle/deploy.cmake | 3 +-
.../celix/bootstrap/templates/bundle/service.h | 10 +-
.../bootstrap/templates/project/CMakeLists.txt | 3 +-
.../bootstrap/templates/project/deploy.cmake | 5 +-
10 files changed, 348 insertions(+), 656 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/generators.py
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/generators.py b/celix-bootstrap/celix/bootstrap/generators.py
index 7854f3f..e9d469b 100644
--- a/celix-bootstrap/celix/bootstrap/generators.py
+++ b/celix-bootstrap/celix/bootstrap/generators.py
@@ -146,15 +146,20 @@ class Project(BaseGenerator):
#python3 super(Project, self).__init__(gendir, "project")
def update_cmakelists(self) :
- options = ["-D", "projectFile=%s" % self.descriptor]
- self.update_file("CMakeLists.txt", "CMakeLists.txt", options, "#")
+ options = ["-D", "projectFile=%s" % self.descriptor]
+ self.update_file("CMakeLists.txt", "CMakeLists.txt", options, "#")
- def create(self) :
- self.update_file(os.path.join(self.template_dir, self.profile, "%s.yaml" % self.profile), "%s.yaml" % self.profile, [], None)
+ def update_deploy_file(self) :
+ options = ["-D", "projectFile=%s" % self.descriptor]
+ self.update_file("deploy.cmake", "deploy.cmake", options, "#")
+
+ def create(self) :
+ self.update_file(os.path.join(self.template_dir, self.profile, "%s.yaml" % self.profile), "%s.yaml" % self.profile, [], None)
def update(self) :
descriptor = self.read_descriptor()
if descriptor is None :
- print("%s does not exist or does not contain a project.yaml file" % self.gendir)
- else :
- self.update_cmakelists()
+ print("%s does not exist or does not contain a project.yaml file" % self.gendir)
+ else :
+ self.update_cmakelists()
+ self.update_deploy_file()
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/CMakeLists.txt b/celix-bootstrap/celix/bootstrap/templates/bundle/CMakeLists.txt
index a6295b2..5e1cdd8 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/CMakeLists.txt
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/CMakeLists.txt
@@ -36,12 +36,13 @@ SET(
SET(BUNDLE_VERSION "0.0.1")
include_directories(
- "private/include"
- "public/include"
+ ${CELIX_INCLUDE_DIR}/dependency_manager
+ "private/include"
+ "public/include"
#{{
#for comp in bundle['components'] :
-# for service in comp['serviceDependencies']:
-# cog.outl("\t\"%s\"" % os.path.dirname(service['include']))
+# for service in comp['serviceDependencies']:
+# cog.outl("\t\"%s\"" % os.path.abspath(os.path.dirname(service['include'])))
#}}
"org.example.mybundle" #do not edit, generated code
#{{end}}
@@ -68,4 +69,8 @@ mybundle SOURCES #do not edit, generated code
SET(BUNDLE_LIB "mybundle") #do not edit, generated code
#{{end}}
-target_link_libraries(${BUNDLE_LIB} ${CELIX_FRAMEWORK_LIBRARY} ${CELIX_UTILS_LIBRARY})
+IF(APPLE)
+target_link_libraries(${BUNDLE_LIB} ${CELIX_FRAMEWORK_LIBRARY} -Wl,-all_load dependency_manager ${CELIX_UTILS_LIBRARY})
+else()
+target_link_libraries(${BUNDLE_LIB} -Wl,--whole-archive dependency_manager -Wl,--no-whole-archive ${CELIX_FRAMEWORK_LIBRARY} ${CELIX_UTILS_LIBRARY})
+ENDIF()
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/bundle.yaml
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/bundle.yaml b/celix-bootstrap/celix/bootstrap/templates/bundle/bundle.yaml
index d85030d..1bf752e 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/bundle.yaml
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/bundle.yaml
@@ -25,40 +25,44 @@ components:
# componentName = checkInput('\nPlease enter componentName', '([a-zA-Z_][a-zA-Z0-9_]*)', 'example')
# cog.outl('- name: \'%s\'' % componentName )
# cog.outl(' providedServices:')
- # while yn('Should component \'%s\' provide %s service?' % (componentName, 'a' if 'psInclude' not in vars() else 'another')):
- # psServiceName1 = checkInput('(1) Please enter a name, which can be used for the filename and the include guards', '([a-zA-Z_][a-zA-Z0-9_]*)');
- # psServiceName2 = checkInput('(2) Please enter a name, which is used to register and lookup the service', '([a-zA-Z_][a-zA-Z0-9_]*)', (psServiceName1.lower() + ('_service' if not psServiceName1.endswith('_service') else '')));
- # psServiceType = checkInput('(3) Please enter a type', '([a-zA-Z_][a-zA-Z0-9_]*)', (psServiceName1.lower() + ('_service_pt' if not psServiceName1.endswith('_service_pt') else '')) );
- # psInclude = checkInput('(4) Please enter the name of the include file', '(.+?)(\.[^.]*$|$)', psServiceName1.lower() + '.h');
+ # while yn('Should component \'%s\' provide %s service?' % (componentName, 'a' if 'psInclude' not in vars() else 'another')):
+ # psServiceName1 = checkInput('(1) Please enter a name, which can be used for the filename and the include guards', '([a-zA-Z_][a-zA-Z0-9_]*)');
+ # psServiceName2 = checkInput('(2) Please enter a name, which is used to register and lookup the service', '([a-zA-Z_][a-zA-Z0-9_]*)', (psServiceName1.lower() + ('_service' if not psServiceName1.endswith('_service') else '')));
+ # psServiceVersion = checkInput('(3) Please enter a version number', '(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)', '1.0.0.0');
+ # psServiceType = checkInput('(4) Please enter a type', '([a-zA-Z_][a-zA-Z0-9_]*)', (psServiceName1.lower() + ('_service_t' if not psServiceName1.endswith('_service_t') else '')) );
+ # psInclude = checkInput('(5) Please enter the name of the include file', '(.+?)(\.[^.]*$|$)', psServiceName1.lower() + '.h');
#
- # print("\n Summary:")
- # print("\tname :\t%s" % (psServiceName1))
- # print("\tservice_name:\t%s" % (psServiceName2))
- # print("\tservice_type:\t%s" % (psServiceType))
- # print("\tinclude file:\t%s" % (psInclude))
- # if yn('Are those information correct?'):
- # cog.outl(' - {include: \'%s\', name: \'%s\', service_name: \'%s\', type: \'%s\'}' % (psInclude, psServiceName1, psServiceName2, psServiceType))
- # else:
- # print("Service was not added.")
+ # print("\n Summary:")
+ # print("\tname :\t%s" % (psServiceName1))
+ # print("\tservice_name:\t%s" % (psServiceName2))
+ # print("\tservice_version:\t%s" % (psServiceVersion))
+ # print("\tservice_type:\t%s" % (psServiceType))
+ # print("\tinclude file:\t%s" % (psInclude))
+ # if yn('Are those information correct?'):
+ # cog.outl(' - {include: \'%s\', name: \'%s\', service_name: \'%s\', service_version: \'%s\', type: \'%s\'}' % (psInclude, psServiceName1, psServiceName2, psServiceVersion, psServiceType))
+ # else:
+ # print("Service was not added.")
#
# cog.outl(' serviceDependencies:')
# while yn('Should component \'%s\' depend on %s service?' % (componentName, 'a' if 'sdInclude' not in vars() else 'another')):
- # sdInclude = checkInclude('(1) Please enter the include filename, which describes the service', '(.+?)(\.[^.]*$|$)');
- # sdServiceName1 = checkInput('(2) Please enter a name, which is used to generate the code', '([a-zA-Z_][a-zA-Z0-9_]*)');
- # sdServiceName2 = checkIncludeContent('(3) Please enter the variable/constants, which is used to register the service within the framework', sdInclude);
- # sdServiceType = checkIncludeContent('(4) Please enter the type of the service', sdInclude);
- # sdCardinality = checkInput('(5) Please enter the cardinality (one|many|optional)', '(one)|(many)|(optional)');
+ # sdInclude = checkInclude('(1) Please enter the include filename, which describes the service', '(.+?)(\.[^.]*$|$)');
+ # sdServiceName1 = checkInput('(2) Please enter a name, which is used to generate the code', '([a-zA-Z_][a-zA-Z0-9_]*)');
+ # sdServiceName2 = checkIncludeContent('(3) Please enter the variable/constants, which is used to register the service within the framework', sdInclude);
+ # sdServiceRange = checkIncludeContent('(4) Please enter the variable/constants, which contains the version range', sdInclude);
+ # sdServiceType = checkIncludeContent('(5) Please enter the type of the service', sdInclude);
+ # sdCardinality = checkInput('(6) Please enter the cardinality (one|many|optional)', '(one)|(many)|(optional)');
#
- # print("\n Summary:")
- # print("\tname :\t%s" % (sdServiceName1))
- # print("\tservice_name:\t%s" % (sdServiceName2))
- # print("\tservice_type:\t%s" % (sdServiceType))
- # print("\tcardinality:\t%s" % (sdCardinality))
- # print("\tinclude file:\t%s" % (sdInclude))
- # if yn('Are those information correct?'):
- # cog.outl(' - {include: \'%s\', name: \'%s\', service_name: \'%s\', type: \'%s\', cardinality: \'%s\'}' % (sdInclude, sdServiceName1, sdServiceName2, sdServiceType, sdCardinality))
- # else:
- # print("Service dependency was not added.")
+ # print("\n Summary:")
+ # print("\tname :\t%s" % (sdServiceName1))
+ # print("\tservice_name:\t%s" % (sdServiceName2))
+ # print("\tservice_range:\t%s" % (sdServiceRange))
+ # print("\tservice_type:\t%s" % (sdServiceType))
+ # print("\tcardinality:\t%s" % (sdCardinality))
+ # print("\tinclude file:\t%s" % (sdInclude))
+ # if yn('Are those information correct?'):
+ # cog.outl(' - {include: \'%s\', name: \'%s\', service_name: \'%s\', service_versionrange: \'%s\', type: \'%s\', cardinality: \'%s\'}' % (sdInclude, sdServiceName1, sdServiceName2, sdServiceRange, sdServiceType, sdCardinality))
+ # else:
+ # print("Service dependency was not added.")
#}}
#{{end}}
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/bundle_activator.c
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/bundle_activator.c b/celix-bootstrap/celix/bootstrap/templates/bundle/bundle_activator.c
index d28b73c..025eed4 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/bundle_activator.c
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/bundle_activator.c
@@ -1,5 +1,21 @@
-//TODO update fields from <service>Type to <service>For<component>Type
-
+/**
+ *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.
+ */
//{{
//import os, yaml
//bundle = None
@@ -17,7 +33,6 @@
//}}
//{{end}}
#include <stdlib.h>
-
#include <pthread.h>
#include <constants.h>
@@ -25,6 +40,9 @@
#include <service_tracker.h>
#include <hash_map.h>
+#include "bundle_activator.h"
+#include "dm_activator_base.h"
+
//Includes for the services / components
//{{
//for comp in bundle['components'] :
@@ -36,448 +54,107 @@
//}}
//{{end}}
-
-
-//Private (static) function declarations
-//{{
-//for comp in bundle['components'] :
-// cog.outl("static bundleActivator_resolveStateFor%s(struct activator *activator);" % comp['name'].title())
-// for service in comp['serviceDependencies'] :
-// cog.outl("static celix_status_t bundleActivator_add%sFor%s(void *handle, service_reference_pt ref, void *service);" % (service['name'].title(), comp['name'].title()))
-// cog.outl("static celix_status_t bundleActivator_remove%sFor%s(void *handle, service_reference_pt ref, void *service);" % (service['name'].title(), comp['name'].title()))
-//}}
-static bundleActivator_resolveStateForExample(struct activator *activator); //do not edit, generated code
-static celix_status_t bundleActivator_addLoggerForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-static celix_status_t bundleActivator_removeLoggerForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-static celix_status_t bundleActivator_addLoggerOptionalForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-static celix_status_t bundleActivator_removeLoggerOptionalForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-static celix_status_t bundleActivator_addLoggerManyForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-static celix_status_t bundleActivator_removeLoggerManyForExample(void *handle, service_reference_pt ref, void *service); //do not edit, generated code
-//{{end}}
-static celix_status_t bundleActivator_getFirst(hash_map_pt services, void **result);
-
-typedef enum component_state {
- COMPONENT_STATE_UNKNOWN = 0,
- COMPONENT_STATE_CREATED = 1,
- COMPONENT_STATE_STARTED = 2,
- COMPONENT_STATE_STOPPED = 3,
- COMPONENT_STATE_DESTROYED = 4
-} component_state_type;
-
-struct activator {
- bundle_context_pt context;
-//Fields for components, service structs, service registries and trackers
//{{
-//cog.outl("//no indent marker")
-//for comp in bundle['components'] :
-// cog.outl("\t%s_pt %s;" % (comp['name'], comp['name']))
-// cog.outl("\tpthread_mutex_t %sLock;" % comp['name'])
-// cog.outl("\tcomponent_state_type %sState;" % comp['name'])
-// for service in comp['serviceDependencies'] :
-// cog.outl("\tservice_tracker_customizer_pt %sCustomizer;" % service['name'])
-// cog.outl("\tservice_tracker_pt %sServiceTracker;" % service['name'])
-// if service['cardinality'] == "one" or service['cardinality'] == "optional" :
-// cog.outl("\thash_map_pt %sServicesFor%s;" % (service['name'], comp['name'].title()))
-// cog.outl("\t%s current%sServiceFor%s;" % (service['type'], service['name'].title(), comp['name'].title()))
-// for service in comp['providedServices'] :
-// cog.outl("\t%s %s;" % (service['type'], service['name']))
-// cog.outl("\tservice_registration_pt %sServiceRegistry;" % service['name'])
-// cog.outl("")
+//cog.outl("struct %s_activator_struct {" %(bundle['name']) )
+//for comp in bundle['components'] :
+// cog.outl(" %s_cmp_t *%sCmp;" %(comp['name'], comp['name']) )
+// for service in comp['providedServices'] :
+// cog.outl(" %s %sServ;" %(service['type'],service['name']) )
+//cog.outl("};");
//}}
-//no indent marker //do not edit, generated code
- example_pt example; //do not edit, generated code
- pthread_mutex_t exampleLock; //do not edit, generated code
- component_state_type exampleState; //do not edit, generated code
- service_tracker_customizer_pt loggerCustomizer; //do not edit, generated code
- service_tracker_pt loggerServiceTracker; //do not edit, generated code
- hash_map_pt loggerServicesForExample; //do not edit, generated code
- log_service_pt currentLoggerServiceForExample; //do not edit, generated code
- service_tracker_customizer_pt loggerOptionalCustomizer; //do not edit, generated code
- service_tracker_pt loggerOptionalServiceTracker; //do not edit, generated code
- hash_map_pt loggerOptionalServicesForExample; //do not edit, generated code
- log_service_pt currentLoggerOptionalServiceForExample; //do not edit, generated code
- service_tracker_customizer_pt loggerManyCustomizer; //do not edit, generated code
- service_tracker_pt loggerManyServiceTracker; //do not edit, generated code
- command_service_pt command; //do not edit, generated code
- service_registration_pt commandServiceRegistry; //do not edit, generated code
- command_service_pt command2; //do not edit, generated code
- service_registration_pt command2ServiceRegistry; //do not edit, generated code
-
-//{{end}}
+struct example_activator_struct {
+ example_cmp_t* exampleCmp;
+ example_t exampleServ;
};
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
- celix_status_t status = CELIX_SUCCESS;
- struct activator *activator = calloc(1, sizeof(struct activator));
- if (activator != NULL) {
- (*userData) = activator;
-//{{
-//for comp in bundle['components'] :
-// cog.outl("//no indent marker")
-// cog.outl("\t\tactivator->%s = NULL;" % comp['name'])
-// cog.outl("\t\t%s_create(&activator->%s);" % (comp['name'], comp['name']))
-// cog.outl("\t\tactivator->%sState = COMPONENT_STATE_CREATED;" % (comp['name']))
-// cog.outl("\t\tpthread_mutex_init(&activator->%sLock, NULL);" % comp['name'])
-//
-// for service in comp['serviceDependencies'] :
-// cog.outl("\t\tactivator->%sServiceTracker = NULL;" % service['name'])
-// cog.outl("\t\tserviceTrackerCustomizer_create(activator, NULL, bundleActivator_add%sFor%s, NULL, bundleActivator_remove%sFor%s, &activator->%sCustomizer);" % (service['name'].title(), comp['name'].title(), service['name'].title(), comp['name'].title(), service['name']))
-// if 'service_name' in service :
-// cog.outl("\t\tserviceTracker_create(context, (char *) %s, activator->%sCustomizer, &activator->%sServiceTracker);" % (service['service_name'], service['name'], service['name']))
-// else :
-// cog.outl("\t\tserviceTracker_createWithService(context, \"%s\", activator->%sCustomizer, &activator->%sServiceTracker);" % (service['filter'], service['name'], service['name']))
-// if service['cardinality'] == "one" or service['cardinality'] == "optional" :
-// cog.outl("\t\tactivator->%sServicesFor%s = hashMap_create(NULL, NULL, NULL, NULL);" % (service['name'], comp['name'].title()))
-// cog.outl("\t\tactivator->current%sServiceFor%s = NULL;" % (service['name'].title(), comp['name'].title()))
-//
-// for service in comp['providedServices'] :
-// cog.outl("\t\tactivator->%s = NULL;" % service['name'])
-// cog.outl("\t\tactivator->%sServiceRegistry = NULL;" % service['name'])
-// cog.outl("")
-//}}
-//no indent marker //do not edit, generated code
- activator->example = NULL; //do not edit, generated code
- example_create(&activator->example); //do not edit, generated code
- activator->exampleState = COMPONENT_STATE_CREATED; //do not edit, generated code
- pthread_mutex_init(&activator->exampleLock, NULL); //do not edit, generated code
- activator->loggerServiceTracker = NULL; //do not edit, generated code
- serviceTrackerCustomizer_create(activator, NULL, bundleActivator_addLoggerForExample, NULL, bundleActivator_removeLoggerForExample, &activator->loggerCustomizer); //do not edit, generated code
- serviceTracker_create(context, (char *) OSGI_LOGSERVICE_NAME, activator->loggerCustomizer, &activator->loggerServiceTracker); //do not edit, generated code
- activator->loggerServicesForExample = hashMap_create(NULL, NULL, NULL, NULL); //do not edit, generated code
- activator->currentLoggerServiceForExample = NULL; //do not edit, generated code
- activator->loggerOptionalServiceTracker = NULL; //do not edit, generated code
- serviceTrackerCustomizer_create(activator, NULL, bundleActivator_addLoggerOptionalForExample, NULL, bundleActivator_removeLoggerOptionalForExample, &activator->loggerOptionalCustomizer); //do not edit, generated code
- serviceTracker_create(context, (char *) OSGI_LOGSERVICE_NAME, activator->loggerOptionalCustomizer, &activator->loggerOptionalServiceTracker); //do not edit, generated code
- activator->loggerOptionalServicesForExample = hashMap_create(NULL, NULL, NULL, NULL); //do not edit, generated code
- activator->currentLoggerOptionalServiceForExample = NULL; //do not edit, generated code
- activator->loggerManyServiceTracker = NULL; //do not edit, generated code
- serviceTrackerCustomizer_create(activator, NULL, bundleActivator_addLoggerManyForExample, NULL, bundleActivator_removeLoggerManyForExample, &activator->loggerManyCustomizer); //do not edit, generated code
- serviceTracker_create(context, (char *) OSGI_LOGSERVICE_NAME, activator->loggerManyCustomizer, &activator->loggerManyServiceTracker); //do not edit, generated code
- activator->command = NULL; //do not edit, generated code
- activator->commandServiceRegistry = NULL; //do not edit, generated code
- activator->command2 = NULL; //do not edit, generated code
- activator->command2ServiceRegistry = NULL; //do not edit, generated code
-
//{{end}}
- } else {
- status = CELIX_ENOMEM;
- }
- return status;
-}
-
-celix_status_t bundleActivator_start(void *userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- struct activator *activator = userData;
- //TODO allocate and assign all declared provided services
- //e.g:
- //activator->command = calloc(1, sizeof(*activator->command));
- //activator->command->command = activator->example;
- //activator->command->getName = example_getStateCommandName;
- //activator->command->getUsage = example_getUsage;
- //activator->command->getShortDescription = example_getStateCommandShortDescription;
- //activator->command->executeCommand = example_executeStateCommand;
-//Start compnent, register service if the service struct is allocated
+celix_status_t dm_create(bundle_context_pt context, void **userData) {
//{{
-//cog.outl("//indent marker")
-//for comp in bundle['components'] :
-// cog.outl("\t%s_start(activator->%s);" % (comp['name'], comp['name']))
-// for service in comp['serviceDependencies'] :
-// cog.outl("\tserviceTracker_open(activator->%sServiceTracker);" % service['name'])
-// for service in comp['providedServices'] :
-// cog.outl("\tif (activator->%s != NULL) {" % service['name'])
-// cog.outl("\t\tbundleContext_registerService(context, (char *) %s_SERVICE_NAME, activator->%s, NULL, &activator->%sServiceRegistry);" % (service['name'].upper(), service['name'], service['name']))
-// cog.outl("\t}")
+//cog.outl(" printf(\"%s: dm_create\\n\");" %(bundle['name']) )
+//cog.outl(" *userData = calloc(1, sizeof(struct %s_activator_struct));" %(bundle['name']) )
//}}
-//indent marker //do not edit, generated code
- example_start(activator->example); //do not edit, generated code
- serviceTracker_open(activator->loggerServiceTracker); //do not edit, generated code
- serviceTracker_open(activator->loggerOptionalServiceTracker); //do not edit, generated code
- serviceTracker_open(activator->loggerManyServiceTracker); //do not edit, generated code
- if (activator->command != NULL) { //do not edit, generated code
- bundleContext_registerService(context, (char *)"commandService", activator->command, NULL, &activator->commandServiceRegistry); //do not edit, generated code
- } //do not edit, generated code
- if (activator->command2 != NULL) { //do not edit, generated code
- bundleContext_registerService(context, (char *)"commandService", activator->command2, NULL, &activator->command2ServiceRegistry); //do not edit, generated code
- } //do not edit, generated code
+ *userData = calloc(1, sizeof(struct example_activator_struct));
+ printf("example: dm_create\n");
//{{end}}
-
- return status;
+ return *userData != NULL ? CELIX_SUCCESS : CELIX_ENOMEM;
}
-celix_status_t bundleActivator_stop(void *userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- struct activator *activator = userData;
-
-//Stop compnent, unregister service if the service struct is allocated
+celix_status_t dm_init(void * userData, bundle_context_pt context, dm_dependency_manager_pt manager) {
+ celix_status_t status = CELIX_SUCCESS;
//{{
-//cog.outl("//indent marker")
-//for comp in bundle['components'] :
-// for service in comp['providedServices'] :
-// cog.outl("\tif (activator->%s != NULL) {" % service['name'])
-// cog.outl("\t\tserviceRegistration_unregister(activator->%sServiceRegistry);" % (service['name']))
-// cog.outl("\t}")
+//cog.outl(" printf(\"%s: dm_init\\n\");" %(bundle['name']) )
+//cog.outl(" struct %s_activator_struct *act = (struct %s_activator_struct *) userData;" %(bundle['name'],bundle['name']) )
+//for comp in bundle['components'] :
+// cog.outl(" act->%sCmp = %s_create();" %(comp['name'],comp['name']) )
+// cog.outl(" if (act->%sCmp != NULL) {" %(comp['name']) )
+// cog.outl(" dm_component_pt cmp%s;" %(comp['name'].title()))
+// cog.outl(" component_create(context, \"%s_PROCESSING_COMPONENT\", &cmp%s);" %(comp['name'].upper(), comp['name'].title()))
+// cog.outl(" component_setImplementation(cmp%s, act->%sCmp);" %(comp['name'].title(), comp['name']) )
+// cog.outl(" component_setCallbacksSafe(cmp%s, %s_cmp_t *, %s_init, %s_start, %s_stop, %s_deinit);" %(comp['name'].title(), comp['name'],comp['name'],comp['name'],comp['name'],comp['name']) )
//
-// for service in comp['serviceDependencies'] :
-// cog.outl("\tserviceTracker_close(activator->%sServiceTracker);" % service['name'])
-// cog.outl("\t%s_stop(activator->%s);" % (comp['name'], comp['name']))
+// for service in comp['providedServices'] :
+// cog.outl(" properties_pt props%s = properties_create();" %(service['name'].title()))
+// cog.outl(" act->%sServ.handle = act->%sCmp;" %(service['name'], comp['name']) )
+// cog.outl(" act->%sServ.callService = (void *)%s%s_callService;" %(service['name'], comp['name'],service['name'].title()) )
+// cog.outl(" properties_set(props%s, \"id\", \"%s\");" %(service['name'].title(), comp['name']) )
+// cog.outl(" component_addInterface(cmp%s, %s_NAME, %s_VERSION, &act->%sServ, props%s);" %(comp['name'].title(), service['name'].upper(), service['name'].upper(), service['name'], service['name'].title()) )
+//
+// for service in comp['serviceDependencies'] :
+// cog.outl(" dm_service_dependency_pt dep%s;" %(service['name'].title()))
+// cog.outl(" serviceDependency_create(&dep%s);" %(service['name'].title()))
+// cog.outl(" serviceDependency_setService(dep%s, (char*) %s, (char*) %s, NULL);" %(service['name'].title(), service['service_name'], service['service_versionrange']))
+// cog.outl(" serviceDependency_setCallbacksSafe(dep%s, %s_cmp_t *, %s, %s_set%s, NULL, NULL, NULL, NULL);" %(service['name'].title(), comp['name'], service['type'], comp['name'], service['name']) )
+// cog.outl(" serviceDependency_setRequired(dep%s, true);" %(service['name'].title()))
+// cog.outl(" component_addServiceDependency(cmp%s, dep%s);" %(comp['name'].title(), service['name'].title()))
+//
+// cog.outl(" dependencyManager_add(manager, cmp%s);" %(comp['name'].title()))
+// cog.outl(" } else {")
+// cog.outl(" status = CELIX_ENOMEM;")
+// cog.outl(" }")
//}}
-//indent marker //do not edit, generated code
- if (activator->command != NULL) { //do not edit, generated code
- serviceRegistration_unregister(activator->commandServiceRegistry); //do not edit, generated code
- } //do not edit, generated code
- if (activator->command2 != NULL) { //do not edit, generated code
- serviceRegistration_unregister(activator->command2ServiceRegistry); //do not edit, generated code
- } //do not edit, generated code
- serviceTracker_close(activator->loggerServiceTracker); //do not edit, generated code
- serviceTracker_close(activator->loggerOptionalServiceTracker); //do not edit, generated code
- serviceTracker_close(activator->loggerManyServiceTracker); //do not edit, generated code
- example_stop(activator->example); //do not edit, generated code
-//{{end}}
+ struct example_activator_struct *act = (struct example_activator_struct *) userData;
+
+ printf("example: dm_init\n");
+
+ act->exampleCmp = example_create();
+ if (act->exampleCmp != NULL) {
+ dm_component_pt cmpExample;
+ component_create(context, "EXAMPLE_PROCESSING_COMPONENT", &cmpExample);
+ component_setImplementation(cmpExample, act->exampleCmp);
+ component_setCallbacksSafe(cmpExample, example_cmp_t *, example_init, example_start, example_stop, example_deinit);
+
+ // provided services
+ properties_pt propsExample = properties_create();
+ act->exampleServ.handle = act->exampleCmp;
+ act->exampleServ.getDate = act->exampleServ_getData;
+ properties_set(propsExample, "id", "example");
+
+ component_addInterface(cmpExample, EXAMPLE_NAME, EXAMPLE_VERSION, &act->exampleServ, propsExample);
+ dependencyManager_add(manager, cmpExample);
+ }
- return status;
-}
-
-celix_status_t bundleActivator_destroy(void *userData, bundle_context_pt context) {
- celix_status_t status = CELIX_SUCCESS;
- struct activator *activator = userData;
-
-//Stop compnent, unregister service if the service struct is allocated
-//{{
-//cog.outl("//indent marker")
-//for comp in bundle['components'] :
-// cog.outl("\t%s_destroy(activator->%s);" % (comp['name'], comp['name']))
-// for service in comp['serviceDependencies'] :
-// cog.outl("\tserviceTracker_destroy(activator->%sServiceTracker);" % service['name'])
-// for service in comp['providedServices'] :
-// cog.outl("\tif (activator->%s != NULL) {" % service['name'])
-// cog.outl("\t\tfree(activator->%s);" % (service['name']))
-// cog.outl("\t\tactivator->%sState = COMPONENT_STATE_DESTROYED;" % comp['name'])
-// cog.outl("\t}")
-//}}
-//indent marker //do not edit, generated code
- example_destroy(activator->example); //do not edit, generated code
- serviceTracker_destroy(activator->loggerServiceTracker); //do not edit, generated code
- serviceTracker_destroy(activator->loggerOptionalServiceTracker); //do not edit, generated code
- serviceTracker_destroy(activator->loggerManyServiceTracker); //do not edit, generated code
- if (activator->command != NULL) { //do not edit, generated code
- free(activator->command); //do not edit, generated code
- activator->exampleState = COMPONENT_STATE_DESTROYED; //do not edit, generated code
- } //do not edit, generated code
- if (activator->command2 != NULL) { //do not edit, generated code
- free(activator->command2); //do not edit, generated code
- activator->exampleState = COMPONENT_STATE_DESTROYED; //do not edit, generated code
- } //do not edit, generated code
//{{end}}
-
- return status;
-}
-
-
-static celix_status_t bundleActivator_getFirst(hash_map_pt services, void **result) {
- celix_status_t status = CELIX_SUCCESS;
- void *highestPrio = NULL;
- int highestPrioRanking = -1;
- int highestPrioServiceId = -1;
- char *rankingStr;
- int ranking;
- char *serviceIdStr;
- int serviceId;
-
- hash_map_iterator_pt iter = hashMapIterator_create(services);
- while (hashMapIterator_hasNext(iter)) {
- service_reference_pt ref = hashMapIterator_nextKey(iter);
- rankingStr = NULL;
- serviceIdStr = NULL;
- serviceReference_getProperty(ref, (char *)OSGI_FRAMEWORK_SERVICE_RANKING, &rankingStr);
- if (rankingStr != NULL) {
- ranking = atoi(rankingStr);
- } else {
- ranking = 0;
- }
- serviceReference_getProperty(ref, (char *)OSGI_FRAMEWORK_SERVICE_RANKING, &serviceIdStr);
- serviceId = atoi(serviceIdStr);
-
- if (ranking > highestPrioRanking) {
- highestPrio = hashMap_get(services, ref);
- } else if (ranking == highestPrioRanking && serviceId < highestPrioServiceId) {
- highestPrio = hashMap_get(services, ref);
- }
- }
-
- if (highestPrio != NULL) {
- (*result) = highestPrio;
- }
- return status;
+ return status;
}
-//ResolveNewState
+celix_status_t dm_destroy(void * userData, bundle_context_pt context, dm_dependency_manager_pt manager) {
//{{
-//for comp in bundle['components'] :
-// cog.outl("static bundleActivator_resolveStateFor%s(struct activator *activator) {" % comp['name'].title())
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-//
-// cog.out("\tif (activator->%sState == COMPONENT_STATE_CREATED " % comp['name'])
-// conditions = [("activator->current%sServiceFor%s != NULL" % (serv['name'].title(), comp['name'].title())) for serv in comp['serviceDependencies'] if serv['cardinality'] == "one"]
-// if len(conditions) > 0:
-// cog.out(" && ")
-// cog.out(" && ".join(conditions))
-// cog.outl(") {")
-// cog.outl("\t\t%s_start(activator->%s);" % (comp['name'], comp['name']))
-// cog.outl("\t}")
-//
-// cog.out("\tif (activator->%sState == COMPONENT_STATE_STARTED " % comp['name'])
-// conditions = [("activator->current%sServiceFor%s == NULL" % (serv['name'].title(), comp['name'].title())) for serv in comp['serviceDependencies'] if serv['cardinality'] == "one"]
-// if len(conditions) > 0:
-// cog.out(" && (");
-// cog.out(" || ".join(conditions))
-// cog.out(")");
-// cog.outl(") {")
-// cog.outl("\t\t%s_stop(activator->%s);" % (comp['name'], comp['name']))
-// cog.outl("\t}")
-//
-// cog.outl("\treturn status;")
-// cog.outl("}")
+//cog.outl(" printf(\"%s: dm-destroy\\n\");" %(bundle['name']) )
+//cog.outl(" struct %s_activator_struct *act = (struct %s_activator_struct *)userData;" %(bundle['name'],bundle['name']) )
+//cog.outl(" if (act->%sCmp != NULL) {" %(comp['name']) )
+//cog.outl(" %s_destroy(act->%sCmp);" %(comp['name'],comp['name']) )
+//cog.outl(" }");
+//cog.outl(" free(act);")
//}}
-static bundleActivator_resolveStateForExample(struct activator *activator) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- if (activator->exampleState == COMPONENT_STATE_CREATED && activator->currentLoggerServiceForExample != NULL) { //do not edit, generated code
- example_start(activator->example); //do not edit, generated code
- } //do not edit, generated code
- if (activator->exampleState == COMPONENT_STATE_STARTED && (activator->currentLoggerServiceForExample == NULL)) { //do not edit, generated code
- example_stop(activator->example); //do not edit, generated code
- } //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
+ struct example_activator_struct *act = (struct example_activator_struct *) userData;
+ printf("example: dm_destroy\n");
+
+ if (act->exampleCmp != NULL) {
+ example_destroy(act->exampleCmp);
+ }
//{{end}}
+ return CELIX_SUCCESS;
+}
-//Add/Remove functions for the trackers
-//{{
-//for comp in bundle['components'] :
-// for service in comp['serviceDependencies'] :
-// cog.outl("static celix_status_t bundleActivator_add%sFor%s(void *handle, service_reference_pt ref, void *service) {" % (service['name'].title(), comp['name'].title()))
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-// cog.outl("\tstruct activator *activator = handle;")
-// cog.outl("\t%s %s = service;" % (service['type'], service['name']))
-// if service['cardinality'] == "many" :
-// cog.outl("\t%s_add%s(activator->%s, %s);" % (comp['name'], service['name'].title(), comp['name'], service['name']))
-// else :
-// cog.outl("\tpthread_mutex_lock(&activator->%sLock);" % comp['name']);
-// cog.outl("\t%s highest = NULL;" % service['type']);
-// cog.outl("\tbundleActivator_getFirst(activator->%sServicesFor%s, (void **)&highest);" % (service['name'], comp['name'].title()))
-// cog.outl("\tif (highest != activator->current%sServiceFor%s) {" % (service['name'].title(), comp['name'].title()))
-// cog.outl("\t\tactivator->current%sServiceFor%s = highest;" % (service['name'].title(), comp['name'].title()))
-// cog.outl("\t\t%s_set%s(activator->%s, highest);" % (comp['name'], service['name'].title(), comp['name']))
-// cog.outl("\t\tbundleActivator_resolveStateFor%s(activator);" % comp['name'].title());
-// cog.outl("\t}")
-// cog.outl("\tpthread_mutex_unlock(&activator->%sLock);" % comp['name']);
-// cog.outl("\treturn status;")
-// cog.outl("}")
-// cog.outl("")
-// cog.outl("static celix_status_t bundleActivator_remove%sFor%s(void *handle, service_reference_pt ref, void *service) {" % (service['name'].title(), comp['name'].title()))
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-// cog.outl("\tstruct activator *activator = handle;")
-// cog.outl("\t%s %s = service;" % (service['type'], service['name']))
-//
-// if service['cardinality'] == "many" :
-// cog.outl("\t%s_remove_%s(activator->%s, %s);" % (comp['name'], service['name'], comp['name'], service['name']))
-// else :
-// cog.outl("\tpthread_mutex_lock(&activator->%sLock);" % comp['name']);
-// cog.outl("\thashMap_remove(activator->%sServicesFor%s, ref);" % (service['name'], comp['name'].title()))
-// cog.outl("\tif (activator->current%sServiceFor%s == service) { " % (service['name'].title(), comp['name'].title()))
-// cog.outl("\t\t%s highest = NULL;" % service['type']);
-// cog.outl("\t\tbundleActivator_getFirst(activator->%sServicesFor%s, (void **)&highest);" % (service['name'], comp['name'].title()))
-// cog.outl("\t\tactivator->current%sServiceFor%s = highest;" % (service['name'].title(), comp['name'].title()))
-// cog.outl("\t\tbundleActivator_resolveStateFor%s(activator);" % comp['name'].title());
-// cog.outl("\t\t%s_set%s(activator->%s, highest);" % (comp['name'], service['name'].title(), comp['name']))
-// cog.outl("\t}")
-// cog.outl("\tpthread_mutex_unlock(&activator->%sLock);" % comp['name']);
-// cog.outl("\treturn status;")
-// cog.outl("}")
-// cog.outl("")
-//}}
-static celix_status_t bundleActivator_addLoggerForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt logger = service; //do not edit, generated code
- pthread_mutex_lock(&activator->exampleLock); //do not edit, generated code
- log_service_pt highest = NULL; //do not edit, generated code
- bundleActivator_getFirst(activator->loggerServicesForExample, (void **)&highest); //do not edit, generated code
- if (highest != activator->currentLoggerServiceForExample) { //do not edit, generated code
- activator->currentLoggerServiceForExample = highest; //do not edit, generated code
- example_setLogger(activator->example, highest); //do not edit, generated code
- bundleActivator_resolveStateForExample(activator); //do not edit, generated code
- } //do not edit, generated code
- pthread_mutex_unlock(&activator->exampleLock); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-static celix_status_t bundleActivator_removeLoggerForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt logger = service; //do not edit, generated code
- pthread_mutex_lock(&activator->exampleLock); //do not edit, generated code
- hashMap_remove(activator->loggerServicesForExample, ref); //do not edit, generated code
- if (activator->currentLoggerServiceForExample == service) { //do not edit, generated code
- log_service_pt highest = NULL; //do not edit, generated code
- bundleActivator_getFirst(activator->loggerServicesForExample, (void **)&highest); //do not edit, generated code
- activator->currentLoggerServiceForExample = highest; //do not edit, generated code
- bundleActivator_resolveStateForExample(activator); //do not edit, generated code
- example_setLogger(activator->example, highest); //do not edit, generated code
- } //do not edit, generated code
- pthread_mutex_unlock(&activator->exampleLock); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-static celix_status_t bundleActivator_addLoggerOptionalForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt loggerOptional = service; //do not edit, generated code
- pthread_mutex_lock(&activator->exampleLock); //do not edit, generated code
- log_service_pt highest = NULL; //do not edit, generated code
- bundleActivator_getFirst(activator->loggerOptionalServicesForExample, (void **)&highest); //do not edit, generated code
- if (highest != activator->currentLoggerOptionalServiceForExample) { //do not edit, generated code
- activator->currentLoggerOptionalServiceForExample = highest; //do not edit, generated code
- example_setLoggerOptional(activator->example, highest); //do not edit, generated code
- bundleActivator_resolveStateForExample(activator); //do not edit, generated code
- } //do not edit, generated code
- pthread_mutex_unlock(&activator->exampleLock); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-static celix_status_t bundleActivator_removeLoggerOptionalForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt loggerOptional = service; //do not edit, generated code
- pthread_mutex_lock(&activator->exampleLock); //do not edit, generated code
- hashMap_remove(activator->loggerOptionalServicesForExample, ref); //do not edit, generated code
- if (activator->currentLoggerOptionalServiceForExample == service) { //do not edit, generated code
- log_service_pt highest = NULL; //do not edit, generated code
- bundleActivator_getFirst(activator->loggerOptionalServicesForExample, (void **) &highest); //do not edit, generated code
- activator->currentLoggerOptionalServiceForExample = highest; //do not edit, generated code
- bundleActivator_resolveStateForExample(activator); //do not edit, generated code
- example_setLoggerOptional(activator->example, highest); //do not edit, generated code
- } //do not edit, generated code
- pthread_mutex_unlock(&activator->exampleLock); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-static celix_status_t bundleActivator_addLoggerManyForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt loggerMany = service; //do not edit, generated code
- example_addLoggerMany(activator->example, loggerMany); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-static celix_status_t bundleActivator_removeLoggerManyForExample(void *handle, service_reference_pt ref, void *service) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- struct activator *activator = handle; //do not edit, generated code
- log_service_pt loggerMany = service; //do not edit, generated code
- example_remove_loggerMany(activator->example, loggerMany); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-//{{end}}
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/component.c
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/component.c b/celix-bootstrap/celix/bootstrap/templates/bundle/component.c
index 78ccdd2..b73cba7 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/component.c
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/component.c
@@ -1,9 +1,33 @@
+/**
+ *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.
+ */
+/*
+ * component.c
+ *
+ * \date Oct 29, 2015
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
//{{
-//import yaml
+//import os, yaml
//bundle = None
-//component = None
//with open(bundleFile) as input :
-// bundle = yaml.load(input)
+// bundle = yaml.load(input)
//
//if not 'components' in bundle or bundle['components'] is None:
// bundle['components'] = []
@@ -11,180 +35,150 @@
// for comp in bundle['components'] :
// if not 'serviceDependencies' in comp or comp['serviceDependencies'] is None:
// comp['serviceDependencies'] = []
-// if not 'providedServices' in comp or comp['providedServices'] is None:
-// comp['providedServices'] = []
+// if not 'providedServices' in comp or comp['providedServices'] is None:
+// comp['providedServices'] = []
+//
//
//for comp in bundle['components'] :
-// if comp['name'] == componentName :
-// component = comp
-// break
+// if comp['name'] == componentName :
+// component = comp
+// break
//}}
//{{end}}
-
-
+#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "celix_threads.h"
-#include <pthread.h>
-//Component Struct
+//Includes for the services / components
//{{
-//cog.outl("#include \"%s.h\"" % componentName);
-//cog.outl("")
-//cog.outl("struct %s {" % componentName)
-//for service in component['serviceDependencies'] :
-// if service['cardinality'] == "many" :
-// cog.outl("\tarray_list_pt %sServices;" % (service['name']))
-// cog.outl("\tpthread_mutex_t mutexFor%sServices;" % service['name'].title());
-// else :
-// cog.outl("\t%s %s;" % (service['type'], service['name']))
-// cog.outl("\tpthread_mutex_t mutexFor%s;" % service['name'].title());
+//cog.outl("#include \"%s.h\"" % component['name'])
+//for service in component['providedServices'] :
+// cog.outl("#include <%s>" % service['include'])
+//for service in component['serviceDependencies'] :
+// cog.outl("#include <%s>" % os.path.split(service['include'])[1])
//}}
-#include "example.h" //do not edit, generated code
-
-struct example { //do not edit, generated code
- log_service_pt logger; //do not edit, generated code
- pthread_mutex_t mutexForLogger; //do not edit, generated code
- log_service_pt loggerOptional; //do not edit, generated code
- pthread_mutex_t mutexForLoggerOptional; //do not edit, generated code
- array_list_pt loggerManyServices; //do not edit, generated code
- pthread_mutex_t mutexForLoggerManyServices; //do not edit, generated code
//{{end}}
+
+
+//{{
+//cog.outl("struct %s_cmp_struct {" %(component['name']) )
+//for service in component['serviceDependencies'] :
+// cog.outl(" %s %sServ;" %(service['type'], service['name']))
+// cog.outl(" celix_thread_mutex_t %sMutex;" %(service['name']))
+//cog.outl("};");
+//}}
+struct example_cmp_struct {
+ phase1_t* phase1Serv;
+ celix_thread_mutex_t mutex;
};
+//{{end}}
+
+
-//Create function
//{{
-//cog.outl("celix_status_t %s_create(%s_pt *result) {" % (componentName, componentName))
-//cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-//cog.outl("printf(\" %s_create called.\\n\");" % (componentName))
-//cog.outl("\t%s_pt component = calloc(1, sizeof(*component));" % componentName)
-//cog.outl("\tif (component != NULL) {")
+//cog.outl("%s_cmp_t *%s_create(void) {" %(component['name'], component['name']))
+//cog.outl(" %s_cmp_t *cmp = calloc(1, sizeof(*cmp));" %(component['name']))
+//cog.outl(" if (cmp != NULL) {")
//for service in component['serviceDependencies'] :
-// if service['cardinality'] == "many" :
-// cog.outl("\t\tcomponent->%sServices = NULL;" % service['name'])
-// cog.outl("\t\tstatus = arrayList_create(&component->%sServices);" % service['name'])
-// cog.outl("\t\tpthread_mutex_init(&component->mutexFor%sServices, NULL);" % service['name'].title())
-// else :
-// cog.outl("\t\tcomponent->%s = NULL;" % service['name'])
-// cog.outl("\t\tpthread_mutex_init(&component->mutexFor%s, NULL);" % service['name'].title())
+// cog.outl(" celixThreadMutex_create(&cmp->%sMutex, NULL);" %(service['name']));
+//cog.outl(" }");
//}}
-celix_status_t example_create(example_pt *result) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- example_pt component = calloc(1, sizeof(*component)); //do not edit, generated code
- if (component != NULL) { //do not edit, generated code
- component->logger = NULL; //do not edit, generated code
- pthread_mutex_init(&component->mutexForLogger, NULL); //do not edit, generated code
- component->loggerOptional = NULL; //do not edit, generated code
- pthread_mutex_init(&component->mutexForLoggerOptional, NULL); //do not edit, generated code
- component->loggerManyServices = NULL; //do not edit, generated code
- status = arrayList_create(&component->loggerManyServices); //do not edit, generated code
- pthread_mutex_init(&component->mutexForLoggerManyServices, NULL); //do not edit, generated code
+example_cmp_t* example_create(void) {
+ example_cmp_t* cmp = calloc(1, sizeof(*cmp));
+ if (cmp != NULL) {
+ celixThreadMutex_create(&cmp->mutex, NULL);
+ }
//{{end}}
- (*result) = component;
- } else {
- status = CELIX_ENOMEM;
- }
- return status;
+
+ return cmp;
}
+//{{
+//cog.outl("int %s_init(%s_cmp_t* cmp) {" %(component['name'], component['name']) )
+//cog.outl(" printf(\"init %s\\n\");" %(component['name']) )
+//}}
+int example_init(example_cmp_t* cmp) {
+ printf("init example\n");
+//{{end}}
+ return 0;
+}
+
+//{{
+//cog.outl("int %s_start(%s_cmp_t* cmp) {" %(component['name'], component['name']) )
+//cog.outl(" printf(\"start %s\\n\");" %(component['name']) )
+//}}
+int example_init(example_cmp_t* cmp) {
+ printf("start example\n");
+//{{end}}
+ return 0;
+}
-//Destroy function
//{{
-//cog.outl("celix_status_t %s_destroy(%s_pt component) {" % (componentName,componentName))
-//cog.outl("printf(\" %s_destroy called.\\n\");" % (componentName))
+//cog.outl("int %s_stop(%s_cmp_t* cmp) {" %(component['name'], component['name']) )
+//cog.outl(" printf(\"stop %s\\n\");" %(component['name']) )
//}}
-celix_status_t example_destroy(example_pt component) { //do not edit, generated code
+int example_stop(example_cmp_t* cmp) {
+ printf("stop example\n");
//{{end}}
- celix_status_t status = CELIX_SUCCESS;
- if (component != NULL) {
- free(component);
- } else {
- status = CELIX_ILLEGAL_ARGUMENT;
- }
- return status;
+ return 0;
}
-//Start function
//{{
-//cog.outl("celix_status_t %s_start(%s_pt component) {" % (componentName,componentName))
-//cog.outl("printf(\" %s_start called.\\n\");" % (componentName))
+//cog.outl("int %s_deinit(%s_cmp_t* cmp) {" %(component['name'], component['name']) )
+//cog.outl(" printf(\"deinit %s\\n\");" %(component['name']) )
//}}
-celix_status_t example_start(example_pt component) { //do not edit, generated code
+int example_deinit(example_cmp_t* cmp) {
+ printf("deinit example\n");
//{{end}}
- celix_status_t status = CELIX_SUCCESS;
- return status;
+ return 0;
}
-//Stop function
//{{
-//cog.outl("celix_status_t %s_stop(%s_pt component) {" % (componentName,componentName))
-//cog.outl("printf(\" %s_stop called.\\n\");" % (componentName))
+//cog.outl("int %s_destroy(%s_cmp_t* cmp) {" %(component['name'], component['name']) )
+//cog.outl(" printf(\"destroy %s\\n\");" %(component['name']) )
//}}
-celix_status_t example_stop(example_pt component) { //do not edit, generated code
+int example_destroy(example_cmp_t* cmp) {
+ printf("destroy example\n");
//{{end}}
- celix_status_t status = CELIX_SUCCESS;
- return status;
+ free(cmp);
+ return 0;
}
+
//{{
//for service in component['serviceDependencies'] :
-// if service['cardinality'] == "many" :
-// cog.outl("celix_status_t %s_add%s(%s_pt component, %s %s) {" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-// cog.outl("printf(\" %s_add%s called.\\n\");" % (componentName, service['name'].title()))
-// cog.outl("\tpthread_mutex_lock(&component->mutexFor%sServices);" % service['name'].title())
-// cog.outl("\tarrayList_add(component->%sServices, %s);" % (service['name'], service['name']))
-// cog.outl("\tpthread_mutex_unlock(&component->mutexFor%sServices);" % service['name'].title())
-// cog.outl("\treturn status;")
-// cog.outl("}")
-// cog.outl("")
-// cog.outl("celix_status_t %s_remove%s(%s_pt component, %s %s) {" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-// cog.outl("\tpthread_mutex_lock(&component->mutexFor%sServices);" % service['name'].title())
-// cog.outl("\tarrayList_removeElement(component->%sServices, %s);" % (service['name'], service['name']))
-// cog.outl("\tpthread_mutex_unlock(&component->mutexFor%sServices);" % service['name'].title())
-// cog.outl("\treturn status;")
-// cog.outl("}")
-// else :
-// cog.outl("celix_status_t %s_set%s(%s_pt component, %s %s) {" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
-// cog.outl("\tcelix_status_t status = CELIX_SUCCESS;")
-// cog.outl("printf(\" %s_set%s called.\\n\");" % (componentName, service['name'].title()))
-// cog.outl("\tpthread_mutex_lock(&component->mutexFor%s);" % service['name'].title())
-// cog.outl("\tcomponent->%s == %s;" % (service['name'], service['name']))
-// cog.outl("\tpthread_mutex_unlock(&component->mutexFor%s);" % service['name'].title())
-// cog.outl("\treturn status;")
-// cog.outl("}")
-// cog.outl("")
+// cog.outl("int %s_set%s(%s_cmp_t* cmp, %s srvc) {" %(component['name'], service['name'], component['name'], service['type']) )
+// cog.outl(" printf(\"%s_set%s called!\\n\");" %(component['name'], service['name']) )
+// cog.outl(" celixThreadMutex_lock(&cmp->%sMutex);" %(service['name']))
+// cog.outl(" cmp->%sServ = srvc;" %(service['name']))
+// cog.outl(" celixThreadMutex_unlock(&cmp->%sMutex);" %(service['name']))
+// cog.outl(" return 0;")
+// cog.outl("}")
//}}
-celix_status_t example_setLogger(example_pt component, log_service_pt logger) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- pthread_mutex_lock(&component->mutexFor:ogger); //do not edit, generated code
- component->logger == logger; //do not edit, generated code
- pthread_mutex_unlock(&component->mutexForLogger); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-celix_status_t example_setLoggerOptional(example_pt component, log_service_pt loggerOptional) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- pthread_mutex_lock(&component->mutexForLoggerOptional); //do not edit, generated code
- component->loggerOptional == loggerOptional; //do not edit, generated code
- pthread_mutex_unlock(&component->mutexForLoggerOptional); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-celix_status_t example_addLoggerMany(example_pt component, log_service_pt loggerMany) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- pthread_mutex_lock(&component->mutexFor:oggerManyServices); //do not edit, generated code
- arrayList_add(component->loggerManyServices, loggerMany); //do not edit, generated code
- pthread_mutex_unlock(&component->mutexForLoggerManyServices); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
-
-celix_status_t example_removeLoggerMany(example_pt component, log_service_pt loggerMany) { //do not edit, generated code
- celix_status_t status = CELIX_SUCCESS; //do not edit, generated code
- pthread_mutex_lock(&component->mutexForLoggerManyServices); //do not edit, generated code
- arrayList_removeElement(component->loggerManyServices, loggerMany); //do not edit, generated code
- pthread_mutex_unlock(&component->mutexForLoggerManyServices); //do not edit, generated code
- return status; //do not edit, generated code
-} //do not edit, generated code
+int example_setDependendService(example_cmp_t* cmp, void* service) {
+ celixThreadMutex_lock(&cmp->mutex);
+ cmp->phase1Serv = service;
+ celixThreadMutex_unlock(&cmp->mutex);
+ return 0;
+}
+//{{end}}
+
+//{{
+//for service in component['providedServices'] :
+// cog.outl("int %s%s_callService(%s_cmp_t* cmp, void* data) {" %(component['name'], service['name'].title(), component['name']) )
+// cog.outl(" printf(\"%s%s callService\\n\");" %(component['name'], service['name'].title() ))
+// cog.outl(" return 0;")
+// cog.outl("}")
+//}}
+
+int example_callService(example_cmp_t* cmp, void* data) {
+ printf("callService called!!\n");
+ return 0;
+}
//{{end}}
+
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/component.h
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/component.h b/celix-bootstrap/celix/bootstrap/templates/bundle/component.h
index 64972fd..ec43f81 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/component.h
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/component.h
@@ -1,9 +1,33 @@
+/**
+ *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.
+ */
+/*
+ * component.c
+ *
+ * \date Oct 29, 2015
+ * \author <a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
//{{
-//import yaml
+//import os, yaml
//bundle = None
-//component = None
//with open(bundleFile) as input :
-// bundle = yaml.load(input)
+// bundle = yaml.load(input)
//
//if not 'components' in bundle or bundle['components'] is None:
// bundle['components'] = []
@@ -23,56 +47,36 @@
//cog.outl("#define __%s_H_" % componentName.upper())
//cog.outl("")
//
-//if 'serviceDependencies' in comp and comp['serviceDependencies'] is not None:
-// for service in component['serviceDependencies'] :
-// cog.outl("#include <%s>" % service['include'])
-// cog.outl("")
+//if 'serviceDependencies' in comp and component['serviceDependencies'] is not None:
+// for service in component['serviceDependencies'] :
+// cog.outl("#include <%s>" % os.path.split(service['include'])[1])
+// cog.outl("")
//
//}}
#ifndef __EXAMPLE_H_ //do not edit, generated code
#define __EXAMPLE_H_ //do not edit, generated code
-
-#include <log_service/log_service.h> //do not edit, generated code
-#include <log_service/log_service.h> //do not edit, generated code
-#include <log_service/log_service.h> //do not edit, generated code
-
//{{end}}
-
#include <celix_errno.h>
-#include <array_list.h>
-
//{{
-//cog.outl("typedef struct %s *%s_pt;" % (componentName, componentName))
-//cog.outl("")
-//cog.outl("celix_status_t %s_create(%s_pt *component);" % (componentName, componentName))
-//cog.outl("celix_status_t %s_start(%s_pt component);" % (componentName, componentName))
-//cog.outl("celix_status_t %s_stop(%s_pt component);" % (componentName, componentName))
-//cog.outl("celix_status_t %s_destroy(%s_pt component);" % (componentName, componentName))
-//
-//#TODO add remote of service dependencies
+//cog.outl("typedef struct %s_cmp_struct %s_cmp_t;" %(component['name'], component['name']))
+//cog.outl("%s_cmp_t *%s_create(void);" %(component['name'], component['name']))
+//cog.outl("int %s_init(%s_cmp_t *cmp);" %(component['name'], component['name']))
+//cog.outl("int %s_start(%s_cmp_t *cmp);" %(component['name'], component['name']))
+//cog.outl("int %s_stop(%s_cmp_t *cmp);" %(component['name'],component['name']))
+//cog.outl("int %s_deinit(%s_cmp_t *cmp);" %(component['name'],component['name']))
+//cog.outl("int %s_destroy(%s_cmp_t *cmp);" %(component['name'],component['name']))
//}}
-typedef struct example *example_pt; //do not edit, generated code
-
-celix_status_t example_create(example_pt *component); //do not edit, generated code
-celix_status_t example_start(example_pt component); //do not edit, generated code
-celix_status_t example_stop(example_pt component); //do not edit, generated code
-celix_status_t example_destroy(example_pt component); //do not edit, generated code
//{{end}}
-
//{{
//for service in component['serviceDependencies'] :
-// if service['cardinality'] == "many" :
-// cog.outl("celix_status_t %s_add%s(%s_pt component, %s %s);" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
-// cog.outl("celix_status_t %s_remove%s(%s_pt component, %s %s);" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
-// else :
-// cog.outl("celix_status_t %s_set%s(%s_pt component, %s %s);" % (componentName, service['name'].title(), componentName, service['type'], service['name']))
+// cog.outl("int %s_set%s(%s_cmp_t* cmp, %s srvc);" %(component['name'], service['name'], component['name'], service['type'] ) )
+//}}
+//{{end}}
+//{{
+//for service in component['providedServices'] :
+// cog.outl("int %s%s_callService(%s_cmp_t* cmp, void* data);" %(component['name'], service['name'].title(), component['name']))
//}}
-celix_status_t example_setLogger(example_pt component, log_service_pt logger); //do not edit, generated code
-celix_status_t example_setLoggerOptional(example_pt component, log_service_pt loggerOptional); //do not edit, generated code
-celix_status_t example_add:oggerMany(example_pt component, log_service_pt loggerMany); //do not edit, generated code
-celix_status_t example_removeLoggerMany(example_pt component, log_service_pt loggerMany); //do not edit, generated code
//{{end}}
-
//{{
//cog.outl("#endif //__%s_H_" % componentName.upper())
//}}
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/deploy.cmake
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/deploy.cmake b/celix-bootstrap/celix/bootstrap/templates/bundle/deploy.cmake
index f654771..2f80596 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/deploy.cmake
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/deploy.cmake
@@ -2,9 +2,10 @@
#import yaml
#bundle = None
#with open(bundleFile) as input :
-# bundle = yaml.load(input)
+# bundle = yaml.load(input)
#cog.outl("deploy( \"%s\" BUNDLES" % bundle['name'])
#cog.outl("\t${CELIX_BUNDLES_DIR}/shell.zip")
+#cog.outl("\t${CELIX_BUNDLES_DIR}/dm_shell.zip")
#cog.outl("\t${CELIX_BUNDLES_DIR}/shell_tui.zip")
#cog.outl("\t${CELIX_BUNDLES_DIR}/log_service.zip")
#cog.outl("\t%s" % bundle['name'])
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/bundle/service.h
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/bundle/service.h b/celix-bootstrap/celix/bootstrap/templates/bundle/service.h
index a6b1fd8..7797fe8 100644
--- a/celix-bootstrap/celix/bootstrap/templates/bundle/service.h
+++ b/celix-bootstrap/celix/bootstrap/templates/bundle/service.h
@@ -31,9 +31,10 @@
//TODO add needed includes
//{{
-//cog.outl("#define %s_SERVICE_NAME \"%s_service\"" % (service['name'].upper(), service['service_name']))
+//cog.outl("#define %s_NAME \"%s_service\"" % (service['name'].upper(), service['service_name']))
+//cog.outl("#define %s_VERSION \"1.0.0.0\"" % (service['name'].upper()))
//cog.outl("")
-//cog.outl("typedef struct %s_service* %s;" % (service['name'], service['type']))
+//cog.outl("typedef struct %s_service %s;" % (service['name'], service['type']))
//cog.outl("")
//cog.outl("struct %s_service {" % service['name'])
//cog.outl("\tvoid *handle;")
@@ -42,10 +43,9 @@
typedef struct benchmark_service *benchmark_service_pt;
struct benchmark_service {
- benchmark_handler_pt handler;
+ benchmark_handler_pt handler;
//{{end}}}
-
- //TODO add service methods
+ void (*callService)(void *handle, void* data);
//{{
//cog.outl("};")
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/project/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/project/CMakeLists.txt b/celix-bootstrap/celix/bootstrap/templates/project/CMakeLists.txt
index b6f7958..6991e4a 100644
--- a/celix-bootstrap/celix/bootstrap/templates/project/CMakeLists.txt
+++ b/celix-bootstrap/celix/bootstrap/templates/project/CMakeLists.txt
@@ -17,7 +17,8 @@ project(myproject C) #do not edit, generated code
#{{end}}
#{{
-# cog.outl("set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"%s/share/celix/cmake/modules\")" % project['celix_install_dir'])
+# cog.outl("set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"%s/share/celix/cmake/modules\")" % project['celix_install_dir'])
+# cog.outl("link_directories(\"%s/lib\")" % project['celix_install_dir'])
#}}
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/usr/local/share/celix/cmake/modules") #do not edit, generated code
#{{end}}
http://git-wip-us.apache.org/repos/asf/celix/blob/37010fbe/celix-bootstrap/celix/bootstrap/templates/project/deploy.cmake
----------------------------------------------------------------------
diff --git a/celix-bootstrap/celix/bootstrap/templates/project/deploy.cmake b/celix-bootstrap/celix/bootstrap/templates/project/deploy.cmake
index 84c3ffb..6001f27 100644
--- a/celix-bootstrap/celix/bootstrap/templates/project/deploy.cmake
+++ b/celix-bootstrap/celix/bootstrap/templates/project/deploy.cmake
@@ -11,6 +11,7 @@
#
#cog.outl("deploy( \"%s\" BUNDLES" % project['name'])
#cog.outl("\t${CELIX_BUNDLES_DIR}/shell.zip")
+#cog.outl("\t${CELIX_BUNDLES_DIR}/dm_shell.zip")
#cog.outl("\t${CELIX_BUNDLES_DIR}/shell_tui.zip")
#cog.outl("\t${CELIX_BUNDLES_DIR}/log_service.zip")
#
@@ -19,8 +20,8 @@
# for foundFile in fnmatch.filter(filenames, 'bundle.yaml'):
# bundleFile = root + '/' + foundFile
# with open(bundleFile) as input :
-# bundle = yaml.load(input)
-# cog.outl("\t%s" % bundle['name'])
+# bundle = yaml.load(input)
+# cog.outl("\t%s" % bundle['name'])
#
#cog.outl(")");
#}}