static celix_status_t stopStartPermutation(bundle_context_pt context, long* permutation, int size) { celix_status_t status = CELIX_SUCCESS; int y = 0; printf("Test stop/start permutation: "); for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) { bundle_pt bundle = NULL; status = bundleContext_getBundleById(context, permutation[y], &bundle); if (status == CELIX_SUCCESS) { module_pt module = NULL; const char *name = NULL; status = bundle_getCurrentModule(bundle, &module); if (status == CELIX_SUCCESS) { status = module_getSymbolicName(module, &name); printf("%s (%ld) ", name, permutation[y]); } } } printf("\n"); // stop all bundles if (status == CELIX_SUCCESS) { for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) { bundle_pt bundle = NULL; status = bundleContext_getBundleById(context, permutation[y], &bundle); if (status == CELIX_SUCCESS) { printf("stop bundle: %ld\n", permutation[y]); status = bundle_stop(bundle); } } } // verify stop state if (status == CELIX_SUCCESS) { for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) { bundle_pt bundle = NULL; status = bundleContext_getBundleById(context, permutation[y], &bundle); if (status == CELIX_SUCCESS) { bundle_state_e state; status = bundle_getState(bundle, &state); if (state != OSGI_FRAMEWORK_BUNDLE_RESOLVED) { printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_RESOLVED); status = CELIX_ILLEGAL_STATE; } } } } // start all bundles if (status == CELIX_SUCCESS) { for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) { bundle_pt bundle = NULL; status = bundleContext_getBundleById(context, permutation[y], &bundle); if (status == CELIX_SUCCESS) { printf("start bundle: %ld\n", permutation[y]); status = bundle_start(bundle); } } } // verify started state if (status == CELIX_SUCCESS) { for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) { bundle_pt bundle = NULL; status = bundleContext_getBundleById(context, permutation[y], &bundle); if (status == CELIX_SUCCESS) { bundle_state_e state; status = bundle_getState(bundle, &state); if (state != OSGI_FRAMEWORK_BUNDLE_ACTIVE) { printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_ACTIVE); status = CELIX_ILLEGAL_STATE; } } } } return status; }
celix_status_t psCommand_execute(void *_ptr, char *command_line_str, FILE *out_ptr, FILE *err_ptr) { celix_status_t status = CELIX_SUCCESS; bundle_context_pt context_ptr = _ptr; array_list_pt bundles_ptr = NULL; bool show_location = false; bool show_symbolic_name = false; bool show_update_location = false; char *message_str = "Name"; if (!context_ptr || !command_line_str || !out_ptr || !err_ptr) { status = CELIX_ILLEGAL_ARGUMENT; } if (status == CELIX_SUCCESS) { status = bundleContext_getBundles(context_ptr, &bundles_ptr); } if (status == CELIX_SUCCESS) { char *sub_str = NULL; char *save_ptr = NULL; strtok_r(command_line_str, OSGI_SHELL_COMMAND_SEPARATOR, &save_ptr); sub_str = strtok_r(NULL, OSGI_SHELL_COMMAND_SEPARATOR, &save_ptr); while (sub_str != NULL) { if (strcmp(sub_str, "-l") == 0) { show_location = true; message_str = "Location"; } else if (strcmp(sub_str, "-s") == 0) { show_symbolic_name = true; message_str = "Symbolic name"; } else if (strcmp(sub_str, "-u") == 0) { show_update_location = true; message_str = "Update location"; } sub_str = strtok_r(NULL, OSGI_SHELL_COMMAND_SEPARATOR, &save_ptr); } fprintf(out_ptr, " %-5s %-12s %s\n", "ID", "State", message_str); unsigned int size = arrayList_size(bundles_ptr); bundle_pt bundles_array_ptr[size]; for (unsigned int i = 0; i < size; i++) { bundles_array_ptr[i] = arrayList_get(bundles_ptr, i); } for (unsigned int i = 0; i < size - 1; i++) { for (unsigned int j = i + 1; j < size; j++) { bundle_pt first_ptr = bundles_array_ptr[i]; bundle_pt second_ptr = bundles_array_ptr[j]; bundle_archive_pt first_archive_ptr = NULL; bundle_archive_pt second_archive_ptr = NULL; long first_id; long second_id; bundle_getArchive(first_ptr, &first_archive_ptr); bundle_getArchive(second_ptr, &second_archive_ptr); bundleArchive_getId(first_archive_ptr, &first_id); bundleArchive_getId(second_archive_ptr, &second_id); if (first_id > second_id) { bundle_pt temp_ptr = bundles_array_ptr[i]; bundles_array_ptr[i] = bundles_array_ptr[j]; bundles_array_ptr[j] = temp_ptr; } } } for (unsigned int i = 0; i < size - 1; i++) { celix_status_t sub_status; bundle_pt bundle_ptr = bundles_array_ptr[i]; bundle_archive_pt archive_ptr = NULL; long id = 0; bundle_state_e state = OSGI_FRAMEWORK_BUNDLE_UNKNOWN; char *state_str = NULL; module_pt module_ptr = NULL; char *name_str = NULL; sub_status = bundle_getArchive(bundle_ptr, &archive_ptr); if (sub_status == CELIX_SUCCESS) { sub_status = bundleArchive_getId(archive_ptr, &id); } if (sub_status == CELIX_SUCCESS) { sub_status = bundle_getState(bundle_ptr, &state); } if (sub_status == CELIX_SUCCESS) { state_str = psCommand_stateString(state); sub_status = bundle_getCurrentModule(bundle_ptr, &module_ptr); } if (sub_status == CELIX_SUCCESS) { sub_status = module_getSymbolicName(module_ptr, &name_str); } if (sub_status == CELIX_SUCCESS) { if (show_location) { sub_status = bundleArchive_getLocation(archive_ptr, &name_str); } else if (show_symbolic_name) { // do nothing } else if (show_update_location) { sub_status = bundleArchive_getLocation(archive_ptr, &name_str); } } if (sub_status == CELIX_SUCCESS) { fprintf(out_ptr, " %-5ld %-12s %s\n", id, state_str, name_str); } if (sub_status != CELIX_SUCCESS) { status = sub_status; break; } } arrayList_destroy(bundles_ptr); } return status; }