Repository: celix Updated Branches: refs/heads/feature/CELIX-230_Refactoring_of_the_shell_command_service [created] 595f3e993
CELIX-230: Initial refatoring. Got ps up again, usage and description not yet working. Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/cea3f9ec Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/cea3f9ec Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/cea3f9ec Branch: refs/heads/feature/CELIX-230_Refactoring_of_the_shell_command_service Commit: cea3f9ec04d0ff8dcc76e3c38ba60dc7a55d250f Parents: b3271bc Author: Pepijn Noltes <pepijnnol...@gmail.com> Authored: Fri Mar 27 17:35:00 2015 +0100 Committer: Pepijn Noltes <pepijnnol...@gmail.com> Committed: Fri Mar 27 17:35:00 2015 +0100 ---------------------------------------------------------------------- framework/private/src/service_reference.c | 2 +- launcher/private/src/launcher.c | 2 + shell/CMakeLists.txt | 28 +--- shell/private/include/help_command.h | 33 ---- shell/private/include/inspect_command.h | 33 ---- shell/private/include/install_command.h | 33 ---- shell/private/include/log_command.h | 33 ---- shell/private/include/ps_command.h | 33 ---- shell/private/include/start_command.h | 33 ---- shell/private/include/std_commands.h | 40 +++++ shell/private/include/stop_command.h | 33 ---- shell/private/include/uninstall_command.h | 33 ---- shell/private/include/update_command.h | 35 ----- shell/private/src/activator.c | 192 +++++++++-------------- shell/private/src/ps_command.c | 209 ++++++++++++------------- shell/private/src/shell.c | 64 ++++---- shell/public/include/command.h | 11 +- shell/public/include/command_impl.h | 48 ------ shell/public/include/shell.h | 1 - shell/public/src/command.c | 45 ------ 20 files changed, 252 insertions(+), 689 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/framework/private/src/service_reference.c ---------------------------------------------------------------------- diff --git a/framework/private/src/service_reference.c b/framework/private/src/service_reference.c index 9f954c5..a9bfff4 100644 --- a/framework/private/src/service_reference.c +++ b/framework/private/src/service_reference.c @@ -26,6 +26,7 @@ #include <stdio.h> #include <stdlib.h> #include <constants.h> +#include <stdint.h> #include "service_reference.h" @@ -37,7 +38,6 @@ #include "bundle.h" #include "celix_log.h" - celix_status_t serviceReference_create(bundle_pt bundle, service_registration_pt registration, service_reference_pt *reference) { celix_status_t status = CELIX_SUCCESS; http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/launcher/private/src/launcher.c ---------------------------------------------------------------------- diff --git a/launcher/private/src/launcher.c b/launcher/private/src/launcher.c index 139d355..1a1f71e 100644 --- a/launcher/private/src/launcher.c +++ b/launcher/private/src/launcher.c @@ -27,6 +27,8 @@ #include <string.h> #include <stdlib.h> #include <libgen.h> +#include <signal.h> + #include <curl/curl.h> http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt index 07f4c6e..8308369 100644 --- a/shell/CMakeLists.txt +++ b/shell/CMakeLists.txt @@ -23,30 +23,18 @@ if (SHELL) SET_HEADERS("Bundle-Name: Apache Celix Shell") bundle(shell SOURCES - public/src/command private/src/activator private/src/shell private/src/ps_command - private/src/start_command - private/src/stop_command - private/src/install_command - private/src/update_command - private/src/uninstall_command - private/src/log_command - private/src/inspect_command - private/src/help_command - - private/include/inspect_command.h - private/include/install_command.h - private/include/log_command.h - private/include/ps_command.h - private/include/shell_private.h - private/include/start_command.h - private/include/stop_command.h - private/include/uninstall_command.h - private/include/update_command.h - private/include/help_command.h + # private/src/start_command + #private/src/stop_command + #private/src/install_command + #private/src/update_command + #private/src/uninstall_command + #private/src/log_command + #private/src/inspect_command + #private/src/help_command ) install_bundle(shell http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/help_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/help_command.h b/shell/private/include/help_command.h deleted file mode 100644 index a975cbf..0000000 --- a/shell/private/include/help_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * help_command.h - * - * \date Aug 20, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef HELP_COMMAND_H_ -#define HELP_COMMAND_H_ - -command_pt helpCommand_create(bundle_context_pt context); -void helpCommand_destroy(command_pt command); - -#endif /* HELP_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/inspect_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/inspect_command.h b/shell/private/include/inspect_command.h deleted file mode 100644 index 7ea9e8e..0000000 --- a/shell/private/include/inspect_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * inspect_command.h - * - * \date Oct 13, 2011 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef INSPECT_COMMAND_H_ -#define INSPECT_COMMAND_H_ - -command_pt inspectCommand_create(bundle_context_pt context); -void inspectCommand_destroy(command_pt command); - -#endif /* INSPECT_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/install_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/install_command.h b/shell/private/include/install_command.h deleted file mode 100644 index a8a6571..0000000 --- a/shell/private/include/install_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * install_command.h - * - * \date Apr 4, 2011 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef INSTALL_COMMAND_H_ -#define INSTALL_COMMAND_H_ - -command_pt installCommand_create(bundle_context_pt context); -void installCommand_destroy(command_pt command); - -#endif /* INSTALL_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/log_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/log_command.h b/shell/private/include/log_command.h deleted file mode 100644 index 4eac17c..0000000 --- a/shell/private/include/log_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * log_command.h - * - * \date Jun 26, 2011 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef LOG_COMMAND_H_ -#define LOG_COMMAND_H_ - -command_pt logCommand_create(bundle_context_pt context); -void logCommand_destroy(command_pt command); - -#endif /* LOG_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/ps_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/ps_command.h b/shell/private/include/ps_command.h deleted file mode 100644 index 941a9f4..0000000 --- a/shell/private/include/ps_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * ps_command.h - * - * \date Aug 13, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef PS_COMMAND_H_ -#define PS_COMMAND_H_ - -command_pt psCommand_create(bundle_context_pt context); -void psCommand_destroy(command_pt command); - -#endif /* PS_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/start_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/start_command.h b/shell/private/include/start_command.h deleted file mode 100644 index 3d76062..0000000 --- a/shell/private/include/start_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * start_command.h - * - * \date Aug 20, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef START_COMMAND_H_ -#define START_COMMAND_H_ - -command_pt startCommand_create(bundle_context_pt context); -void startCommand_destroy(command_pt command); - -#endif /* START_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/std_commands.h ---------------------------------------------------------------------- diff --git a/shell/private/include/std_commands.h b/shell/private/include/std_commands.h new file mode 100644 index 0000000..cb7322c --- /dev/null +++ b/shell/private/include/std_commands.h @@ -0,0 +1,40 @@ +/** + *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. + */ +/* + * std_commands.h + * + * \date March 27, 2014 + * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> + * \copyright Apache License, Version 2.0 + */ + +#ifndef __STD_COMMANDS_H_ +#define __STD_COMMANDS_H_ + +celix_status_t psCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t startCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t stopCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t installCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t uninstallCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t updateCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t logCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t inspectCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); +celix_status_t helpCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream); + +#endif http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/stop_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/stop_command.h b/shell/private/include/stop_command.h deleted file mode 100644 index 3b93924..0000000 --- a/shell/private/include/stop_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * stop_command.h - * - * \date Aug 20, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef STOP_COMMAND_H_ -#define STOP_COMMAND_H_ - -command_pt stopCommand_create(bundle_context_pt context); -void stopCommand_destroy(command_pt command); - -#endif /* STOP_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/uninstall_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/uninstall_command.h b/shell/private/include/uninstall_command.h deleted file mode 100644 index 2e2fe97..0000000 --- a/shell/private/include/uninstall_command.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - *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. - */ -/* - * uninstall_command.h - * - * \date Aug 20, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef UNINSTALL_COMMAND_H_ -#define UNINSTALL_COMMAND_H_ - -command_pt uninstallCommand_create(bundle_context_pt context); -void uninstallCommand_destroy(command_pt command); - -#endif /* UNINSTALL_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/include/update_command.h ---------------------------------------------------------------------- diff --git a/shell/private/include/update_command.h b/shell/private/include/update_command.h deleted file mode 100644 index 0b83928..0000000 --- a/shell/private/include/update_command.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - *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. - */ -/* - * update_command.h - * - * \date Aug 20, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef UPDATE_COMMAND_H_ -#define UPDATE_COMMAND_H_ - -#include "command.h" - -command_pt updateCommand_create(bundle_context_pt context); -void updateCommand_destroy(command_pt command); - -#endif /* UPDATE_COMMAND_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/src/activator.c ---------------------------------------------------------------------- diff --git a/shell/private/src/activator.c b/shell/private/src/activator.c index 92ba36e..595894e 100644 --- a/shell/private/src/activator.c +++ b/shell/private/src/activator.c @@ -28,32 +28,40 @@ #include "shell_private.h" #include "bundle_activator.h" -#include "command_impl.h" #include "bundle_context.h" #include "service_registration.h" #include "service_listener.h" +#include "utils.h" +#include "std_commands.h" +#include "properties.h" + +struct command { + celix_status_t (*exec)(void *handle, char *commandLine, FILE *out, FILE *err); + char *name; + char *description; + char *usage; + command_service_pt service; + service_registration_pt reg; + properties_pt props; +}; -#include "ps_command.h" -#include "start_command.h" -#include "stop_command.h" -#include "install_command.h" -#include "uninstall_command.h" -#include "update_command.h" -#include "log_command.h" -#include "inspect_command.h" -#include "help_command.h" +static struct command std_commands[] = { + {psCommand_execute, "ps", "list installed bundles.", "ps [-l | -s | -u]", NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL, NULL, NULL} /*marker for last element*/ +}; -#include "utils.h" struct bundle_instance { shell_service_pt shellService; service_registration_pt registration; service_listener_pt listener; - service_registration_pt psCommand; - command_pt psCmd; - command_service_pt psCmdSrv; + service_registration_pt commandRegistrations; + command_service_pt commandServices; + properties_pt commandProperties; + /* + ps service_registration_pt startCommand; command_pt startCmd; command_service_pt startCmdSrv; @@ -85,29 +93,11 @@ struct bundle_instance { service_registration_pt helpCommand; command_pt helpCmd; command_service_pt helpCmdSrv; + */ }; typedef struct bundle_instance *bundle_instance_pt; -static celix_status_t shell_createCommandService(command_pt command, command_service_pt *commandService) { - celix_status_t status = CELIX_SUCCESS; - - *commandService = calloc(1, sizeof(**commandService)); - - if (!*commandService) { - status = CELIX_ENOMEM; - } - else { - (*commandService)->command = command; - (*commandService)->executeCommand = command->executeCommand; - (*commandService)->getName = command_getName; - (*commandService)->getShortDescription = command_getShortDescription; - (*commandService)->getUsage = command_getUsage; - } - - return status; -} - celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { celix_status_t status = CELIX_SUCCESS; @@ -121,20 +111,32 @@ celix_status_t bundleActivator_create(bundle_context_pt context, void **userData free(bi); } else { - bi->listener = NULL; - bi->psCommand = NULL; - bi->startCommand = NULL; - bi->stopCommand = NULL; - bi->installCommand = NULL; - bi->uninstallCommand = NULL; - bi->updateCommand = NULL; - bi->logCommand = NULL; - bi->inspectCommand = NULL; - bi->helpCommand = NULL; - bi->registration = NULL; - status = shell_create(context, &bi->shellService); + int i = 0; + while (std_commands[i].exec != NULL) { + std_commands[i].props = properties_create(); + if (std_commands[i].props != NULL) { + properties_set(std_commands[i].props, "command.name", std_commands[i].name); + properties_set(std_commands[i].props, "command.usage", std_commands[i].usage); + properties_set(std_commands[i].props, "command.description", std_commands[i].description); + + std_commands[i].service = calloc(1, sizeof(struct commandService)); + if (std_commands[i].service != NULL) { + std_commands[i].service->handle = context; + std_commands[i].service->executeCommand = std_commands[i].exec; + } else { + status = CELIX_ENOMEM; + break; + } + } else { + status = CELIX_ENOMEM; + break; + } + + i += 1; + } + if (status != CELIX_SUCCESS) { printf("shell_create failed\n"); } @@ -171,41 +173,15 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) } if (status == CELIX_SUCCESS) { - bi->psCmd = psCommand_create(context); - shell_createCommandService(bi->psCmd, &bi->psCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->psCmdSrv, NULL, &bi->psCommand); - bi->startCmd = startCommand_create(context); - shell_createCommandService(bi->startCmd, &bi->startCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->startCmdSrv, NULL, &bi->startCommand); + int i = 0; + while (std_commands[i].exec != NULL) { + status = bundleContext_registerService(context, (char *)OSGI_SHELL_COMMAND_SERVICE_NAME, std_commands[i].service, std_commands[i].props, &std_commands[i].reg); + if (status != CELIX_SUCCESS) { + break; + } + } - bi->stopCmd = stopCommand_create(context); - shell_createCommandService(bi->stopCmd, &bi->stopCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->stopCmdSrv, NULL, &bi->stopCommand); - - bi->installCmd = installCommand_create(context); - shell_createCommandService(bi->installCmd, &bi->installCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->installCmdSrv, NULL, &bi->installCommand); - - bi->uninstallCmd = uninstallCommand_create(context); - shell_createCommandService(bi->uninstallCmd, &bi->uninstallCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->uninstallCmdSrv, NULL, &bi->uninstallCommand); - - bi->updateCmd = updateCommand_create(context); - shell_createCommandService(bi->updateCmd, &bi->updateCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->updateCmdSrv, NULL, &bi->updateCommand); - - bi->logCmd = logCommand_create(context); - shell_createCommandService(bi->logCmd, &bi->logCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->logCmdSrv, NULL, &bi->logCommand); - - bi->inspectCmd = inspectCommand_create(context); - shell_createCommandService(bi->inspectCmd, &bi->inspectCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->inspectCmdSrv, NULL, &bi->inspectCommand); - - bi->helpCmd = helpCommand_create(context); - shell_createCommandService(bi->helpCmd, &bi->helpCmdSrv); - bundleContext_registerService(context, (char *) OSGI_SHELL_COMMAND_SERVICE_NAME, bi->helpCmdSrv, NULL, &bi->helpCommand); } arrayList_destroy(references); } @@ -217,16 +193,13 @@ celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) celix_status_t status = CELIX_SUCCESS; bundle_instance_pt bi = (bundle_instance_pt) userData; - serviceRegistration_unregister(bi->registration); - serviceRegistration_unregister(bi->psCommand); - serviceRegistration_unregister(bi->startCommand); - serviceRegistration_unregister(bi->stopCommand); - serviceRegistration_unregister(bi->installCommand); - serviceRegistration_unregister(bi->uninstallCommand); - serviceRegistration_unregister(bi->updateCommand); - serviceRegistration_unregister(bi->logCommand); - serviceRegistration_unregister(bi->inspectCommand); - serviceRegistration_unregister(bi->helpCommand); + //serviceRegistration_unregister(bi->registration); + int i = 0; + while (std_commands[i].exec != NULL) { + if (std_commands[i].reg!= NULL) { + serviceRegistration_unregister(std_commands[i].reg); + } + } status = bundleContext_removeServiceListener(context, bi->listener); @@ -236,39 +209,16 @@ celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { bundle_instance_pt bi = (bundle_instance_pt) userData; - psCommand_destroy(bi->psCmd); - free(bi->psCmdSrv); - - startCommand_destroy(bi->startCmd); - free(bi->startCmdSrv); - - stopCommand_destroy(bi->stopCmd); - free(bi->stopCmdSrv); - - installCommand_destroy(bi->installCmd); - free(bi->installCmdSrv); - - uninstallCommand_destroy(bi->uninstallCmd); - free(bi->uninstallCmdSrv); - - updateCommand_destroy(bi->updateCmd); - free(bi->updateCmdSrv); - - logCommand_destroy(bi->logCmd); - free(bi->logCmdSrv); - - inspectCommand_destroy(bi->inspectCmd); - free(bi->inspectCmdSrv); - - inspectCommand_destroy(bi->helpCmd); - free(bi->helpCmdSrv); - - free(bi->listener); - bi->listener = NULL; - - shell_destroy(&bi->shellService); - bi->shellService = NULL; - free(bi); + int i = 0; + while (std_commands[i].exec != NULL) { + if (std_commands[i].props != NULL) { + properties_destroy(std_commands[i].props); + } + if (std_commands[i].service != NULL) { + free(std_commands[i].service); + } + i += 1; + } return CELIX_SUCCESS; } http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/src/ps_command.c ---------------------------------------------------------------------- diff --git a/shell/private/src/ps_command.c b/shell/private/src/ps_command.c index fbc6470..7511391 100644 --- a/shell/private/src/ps_command.c +++ b/shell/private/src/ps_command.c @@ -17,134 +17,117 @@ *under the License. */ /* - * ps_command.c + * std_shell_commands.c * - * \date Aug 13, 2010 + * \date March 27, 2014 * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> * \copyright Apache License, Version 2.0 */ #include <stdlib.h> #include <string.h> -#include "command_impl.h" #include "array_list.h" #include "bundle_context.h" #include "bundle_archive.h" #include "module.h" #include "bundle.h" -char * psCommand_stateString(bundle_state_e state); -void psCommand_execute(command_pt command, char * line, void (*out)(char *), void (*err)(char *)); - -command_pt psCommand_create(bundle_context_pt context) { - command_pt command = (command_pt) malloc(sizeof(*command)); - command->bundleContext = context; - command->name = "ps"; - command->shortDescription = "list installed bundles."; - command->usage = "ps [-l | -s | -u]"; - command->executeCommand = psCommand_execute; - return command; -} - -void psCommand_destroy(command_pt command) { - free(command); -} - -void psCommand_execute(command_pt command, char * commandline, void (*out)(char *), void (*err)(char *)) { - array_list_pt bundles = NULL; - celix_status_t status = bundleContext_getBundles(command->bundleContext, &bundles); - - if (status == CELIX_SUCCESS) { - bool showLocation = false; - bool showSymbolicName = false; - bool showUpdateLocation = false; - char * msg = "Name"; - char line[256]; - unsigned int i; - - char delims[] = " "; - char * sub = NULL; - char *save_ptr = NULL; - sub = strtok_r(commandline, delims, &save_ptr); - sub = strtok_r(NULL, delims, &save_ptr); - while (sub != NULL) { - if (strcmp(sub, "-l") == 0) { - showLocation = true; - msg = "Location"; - } else if (strcmp(sub, "-s") == 0) { - showSymbolicName = true; - msg = "Symbolic name"; - } else if (strcmp(sub, "-u") == 0) { - showUpdateLocation = true; - msg = "Update location"; - } - sub = strtok_r(NULL, delims, &save_ptr); - } - - sprintf(line, " %-5s %-12s %s\n", "ID", "State", msg); - out(line); - - unsigned int size = arrayList_size(bundles); - bundle_pt bundlesA[size]; - for (i = 0; i < size; i++) { - bundlesA[i] = arrayList_get(bundles, i); - } - - int j; - for(i=0; i < size - 1; i++) { - for(j=i+1; j < size; j++) { - bundle_pt first = bundlesA[i]; - bundle_pt second = bundlesA[j]; - - bundle_archive_pt farchive = NULL, sarchive = NULL; - long fid, sid; - - bundle_getArchive(first, &farchive); - bundleArchive_getId(farchive, &fid); - bundle_getArchive(second, &sarchive); - bundleArchive_getId(sarchive, &sid); - - if(fid > sid) - { - // these three lines swap the elements bundles[i] and bundles[j]. - bundle_pt temp = bundlesA[i]; - bundlesA[i] = bundlesA[j]; - bundlesA[j] = temp; - } - } - } - for (i = 0; i < size; i++) { - //bundle_pt bundle = (bundle_pt) arrayList_get(bundles, i); - bundle_pt bundle = bundlesA[i]; - bundle_archive_pt archive = NULL; - long id; - bundle_state_e state; - char * stateString = NULL; - module_pt module = NULL; - char * name = NULL; - - bundle_getArchive(bundle, &archive); - bundleArchive_getId(archive, &id); - bundle_getState(bundle, &state); - stateString = psCommand_stateString(state); - bundle_getCurrentModule(bundle, &module); - module_getSymbolicName(module, &name); - if (showLocation) { - bundleArchive_getLocation(archive, &name); - } else if (showSymbolicName) { - // do nothing - } else if (showUpdateLocation) { - bundleArchive_getLocation(archive, &name); - } - - sprintf(line, " %-5ld %-12s %s\n", id, stateString, name); - out(line); - } - arrayList_destroy(bundles); - } +static char * psCommand_stateString(bundle_state_e state); + +celix_status_t psCommand_execute(void *handle, char * commandline, FILE *outStream, FILE *errStream) { + celix_status_t status = CELIX_SUCCESS; + array_list_pt bundles = NULL; + bundle_context_pt context = handle; + + status = bundleContext_getBundles(context, &bundles); + + bool showLocation = false; + bool showSymbolicName = false; + bool showUpdateLocation = false; + char * msg = "Name"; + unsigned int i; + + char delims[] = " "; + char * sub = NULL; + char *save_ptr = NULL; + sub = strtok_r(commandline, delims, &save_ptr); + sub = strtok_r(NULL, delims, &save_ptr); + while (sub != NULL) { + if (strcmp(sub, "-l") == 0) { + showLocation = true; + msg = "Location"; + } else if (strcmp(sub, "-s") == 0) { + showSymbolicName = true; + msg = "Symbolic name"; + } else if (strcmp(sub, "-u") == 0) { + showUpdateLocation = true; + msg = "Update location"; + } + sub = strtok_r(NULL, delims, &save_ptr); + } + + fprintf(outStream, " %-5s %-12s %s\n", "ID", "State", msg); + + unsigned int size = arrayList_size(bundles); + bundle_pt bundlesA[size]; + for (i = 0; i < size; i++) { + bundlesA[i] = arrayList_get(bundles, i); + } + + int j; + for(i=0; i < size - 1; i++) { + for(j=i+1; j < size; j++) { + bundle_pt first = bundlesA[i]; + bundle_pt second = bundlesA[j]; + + bundle_archive_pt farchive = NULL, sarchive = NULL; + long fid, sid; + + bundle_getArchive(first, &farchive); + bundleArchive_getId(farchive, &fid); + bundle_getArchive(second, &sarchive); + bundleArchive_getId(sarchive, &sid); + + if(fid > sid) + { + // these three lines swap the elements bundles[i] and bundles[j]. + bundle_pt temp = bundlesA[i]; + bundlesA[i] = bundlesA[j]; + bundlesA[j] = temp; + } + } + } + for (i = 0; i < size; i++) { + //bundle_pt bundle = (bundle_pt) arrayList_get(bundles, i); + bundle_pt bundle = bundlesA[i]; + bundle_archive_pt archive = NULL; + long id; + bundle_state_e state; + char * stateString = NULL; + module_pt module = NULL; + char * name = NULL; + + bundle_getArchive(bundle, &archive); + bundleArchive_getId(archive, &id); + bundle_getState(bundle, &state); + stateString = psCommand_stateString(state); + bundle_getCurrentModule(bundle, &module); + module_getSymbolicName(module, &name); + if (showLocation) { + bundleArchive_getLocation(archive, &name); + } else if (showSymbolicName) { + // do nothing + } else if (showUpdateLocation) { + bundleArchive_getLocation(archive, &name); + } + + fprintf(outStream, " %-5ld %-12s %s\n", id, stateString, name); + } + arrayList_destroy(bundles); + return status; } -char * psCommand_stateString(bundle_state_e state) { +static char * psCommand_stateString(bundle_state_e state) { switch (state) { case OSGI_FRAMEWORK_BUNDLE_ACTIVE: return "Active "; http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/private/src/shell.c ---------------------------------------------------------------------- diff --git a/shell/private/src/shell.c b/shell/private/src/shell.c index 18ee201..4b3e494 100644 --- a/shell/private/src/shell.c +++ b/shell/private/src/shell.c @@ -30,21 +30,10 @@ #include "shell_private.h" #include "bundle_activator.h" -#include "command_impl.h" #include "bundle_context.h" #include "service_registration.h" #include "service_listener.h" -#include "ps_command.h" -#include "start_command.h" -#include "stop_command.h" -#include "install_command.h" -#include "uninstall_command.h" -#include "update_command.h" -#include "log_command.h" -#include "inspect_command.h" -#include "help_command.h" - #include "utils.h" static command_service_pt shell_getCommand(shell_pt shell, char * commandName); @@ -65,7 +54,6 @@ celix_status_t shell_create(bundle_context_pt context, shell_service_pt* shellSe lclService->getCommands = shell_getCommands; lclService->getCommandDescription = shell_getCommandDescription; lclService->getCommandUsage = shell_getCommandUsage; - lclService->getCommandReference = shell_getCommandReference; lclService->executeCommand = shell_executeCommand; *shellService = lclService; @@ -92,10 +80,18 @@ celix_status_t shell_addCommand(shell_pt shell, service_reference_pt reference) command_service_pt command = NULL; void *cmd = NULL; + char *name = NULL; bundleContext_getService(shell->bundleContext, reference, &cmd); + serviceReference_getProperty(reference, "command.name", &name); command = (command_service_pt) cmd; - hashMap_put(shell->commandNameMap, command->getName(command->command), command); - hashMap_put(shell->commandReferenceMap, reference, command); + if (name != NULL) { + hashMap_put(shell->commandNameMap, name, command); + hashMap_put(shell->commandReferenceMap, reference, command); + } else { + status = CELIX_ILLEGAL_ARGUMENT; + fprintf(stderr, "TODO\n"); + //TODO log to log service + } return status; } @@ -104,11 +100,13 @@ celix_status_t shell_removeCommand(shell_pt shell, service_reference_pt referenc celix_status_t status = CELIX_SUCCESS; command_service_pt command = (command_service_pt) hashMap_remove(shell->commandReferenceMap, reference); - if (command != NULL) { + char *name = NULL; + serviceReference_getProperty(reference, "command.name", &name); + if (command != NULL && name != NULL) { bool result = false; - hashMap_remove(shell->commandNameMap, command->getName(command->command)); + hashMap_remove(shell->commandNameMap, name); bundleContext_ungetService(shell->bundleContext, reference, &result); - } + } return status; } @@ -127,26 +125,21 @@ array_list_pt shell_getCommands(shell_pt shell) { } char * shell_getCommandUsage(shell_pt shell, char * commandName) { - command_service_pt command = hashMap_get(shell->commandNameMap, commandName); - return (command == NULL) ? NULL : command->getUsage(command->command); + //command_service_pt command = hashMap_get(shell->commandNameMap, commandName); + // char *usage = NULL; + // bundleContext_getProperty(shell->bundleContext, "command.usage", &usage); + //return (command == NULL || usage == NULL) ? NULL : usage; + return "TODO"; } char * shell_getCommandDescription(shell_pt shell, char * commandName) { + /* command_service_pt command = hashMap_get(shell->commandNameMap, commandName); - return (command == NULL) ? NULL : command->getShortDescription(command->command); -} - -service_reference_pt shell_getCommandReference(shell_pt shell, char * command) { - hash_map_iterator_pt iter = hashMapIterator_create(shell->commandReferenceMap); - while (hashMapIterator_hasNext(iter)) { - hash_map_entry_pt entry = hashMapIterator_nextEntry(iter); - command_service_pt cmd = (command_service_pt) hashMapEntry_getValue(entry); - if (strcmp(cmd->getName(cmd->command), command) == 0) { - return (service_reference_pt) hashMapEntry_getValue(entry); - } - } - hashMapIterator_destroy(iter); - return NULL; + char *desc = NULL; + bundleContext_getProperty(shell->bundleContext, "command.description", &desc); + return (command == NULL || desc == NULL) ? NULL : desc; + */ + return "TODO"; } void shell_executeCommand(shell_pt shell, char * commandLine, void (*out)(char *), void (*error)(char *)) { @@ -154,7 +147,10 @@ void shell_executeCommand(shell_pt shell, char * commandLine, void (*out)(char * char * commandName = (pos != strlen(commandLine)) ? string_ndup((char *) commandLine, pos) : strdup(commandLine); command_service_pt command = shell_getCommand(shell, commandName); if (command != NULL) { - command->executeCommand(command->command, commandLine, out, error); + printf("TODO\n"); + //FIXME udpate shell_executeCommand with FILE + //command->executeCommand(command->command, commandLine, out, error); + command->executeCommand(command->handle, commandLine, stdout, stderr); } else { error("No such command\n"); } http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/public/include/command.h ---------------------------------------------------------------------- diff --git a/shell/public/include/command.h b/shell/public/include/command.h index 81fcd3d..710bf9d 100644 --- a/shell/public/include/command.h +++ b/shell/public/include/command.h @@ -27,18 +27,15 @@ #ifndef COMMAND_H_ #define COMMAND_H_ -static const char * const OSGI_SHELL_COMMAND_SERVICE_NAME = "commandService"; +#include "celix_errno.h" -typedef struct command * command_pt; +static const char * const OSGI_SHELL_COMMAND_SERVICE_NAME = "commandService"; typedef struct commandService * command_service_pt; struct commandService { - command_pt command; - char * (*getName)(command_pt command); - char * (*getUsage)(command_pt command); - char * (*getShortDescription)(command_pt command); - void (*executeCommand)(command_pt command, char * commandLine, void (*out)(char *), void (*error)(char *)); + void *handle; + celix_status_t (*executeCommand)(void *handle, char * commandLine, FILE *outStream, FILE *errorStream); }; http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/public/include/command_impl.h ---------------------------------------------------------------------- diff --git a/shell/public/include/command_impl.h b/shell/public/include/command_impl.h deleted file mode 100644 index ae33738..0000000 --- a/shell/public/include/command_impl.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - *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. - */ -/* - * command_impl.h - * - * \date Aug 13, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#ifndef COMMAND_PRIVATE_H_ -#define COMMAND_PRIVATE_H_ - -#include "command.h" -#include "bundle_context.h" - -struct command { - char * name; - char * usage; - char * shortDescription; - - bundle_context_pt bundleContext; - void *handle; - - void (*executeCommand)(command_pt command, char * commandLine, void (*out)(char *), void (*error)(char *)); -}; - -char *command_getName(command_pt command); -char *command_getUsage(command_pt command); -char *command_getShortDescription(command_pt command); - -#endif /* COMMAND_PRIVATE_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/public/include/shell.h ---------------------------------------------------------------------- diff --git a/shell/public/include/shell.h b/shell/public/include/shell.h index 25706c7..11a79b3 100644 --- a/shell/public/include/shell.h +++ b/shell/public/include/shell.h @@ -39,7 +39,6 @@ struct shellService { array_list_pt (*getCommands)(shell_pt shell); char * (*getCommandUsage)(shell_pt shell, char * commandName); char * (*getCommandDescription)(shell_pt shell, char * commandName); - service_reference_pt (*getCommandReference)(shell_pt shell, char * command); void (*executeCommand)(shell_pt shell, char * commandLine, void (*out)(char *), void (*error)(char *)); }; http://git-wip-us.apache.org/repos/asf/celix/blob/cea3f9ec/shell/public/src/command.c ---------------------------------------------------------------------- diff --git a/shell/public/src/command.c b/shell/public/src/command.c deleted file mode 100644 index 955fbe4..0000000 --- a/shell/public/src/command.c +++ /dev/null @@ -1,45 +0,0 @@ -/** - *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. - */ -/* - * command.c - * - * \date Aug 13, 2010 - * \author <a href="mailto:d...@celix.apache.org">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - -#include <stdio.h> - -#include "command_impl.h" - -char * command_getName(command_pt command) { - return command->name; -} - -char * command_getUsage(command_pt command) { - return command->usage; -} - -char * command_getShortDescription(command_pt command) { - return command->shortDescription; -} - -void command_execute(command_pt command, char * line, void (*out)(char *), void (*err)(char *)) { - command->executeCommand(command, line, out, err); -}