blob: 72602bdc6de5f215a85e87f2da0b8c9cdc881d74 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.framework.internal.core;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.*;
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.eclipse.osgi.framework.launcher.Launcher;
import org.osgi.framework.BundleException;
/**
* This class provides methods to execute commands from the command line. It registers
* itself as a CommandProvider so it can be invoked by a CommandInterpreter. The
* FrameworkCommandProvider registers itself with the highest ranking (Integer.MAXVALUE) so it will always be
* called first. Other CommandProviders should register with lower rankings.
*
* The commands provided by this class are:
---Controlling the OSGi framework---
close - shutdown and exit
exit - exit immediately (System.exit)
gc - perform a garbage collection
init - uninstall all bundles
launch - start the Service Management Framework
setprop <key>=<value> - set the OSGI property
shutdown - shutdown the Service Management Framework
---Controlliing Bundles---
install <url> {s[tart]} - install and optionally start bundle from the given URL
refresh (<id>|<location>) - refresh the packages of the specified bundles
start (<id>|<location>) - start the specified bundle(s)
stop (<id>|<location>) - stop the specified bundle(s)
uninstall (<id>|<location>) - uninstall the specified bundle(s)
update (<id>|<location>|<*>) - update the specified bundle(s)
---Displaying Status---
bundle (<id>|<location>) - display details for the specified bundle(s)
bundles - display details for all installed bundles
headers (<id>|<location>) - print bundle headers
packages {<pkgname>|<id>|<location>} - display imported/exported package details
props - display System properties
services {filter} - display registered service details
ss - display installed bundles (short status)
status - display installed bundles and registered services
threads - display threads and thread groups
---Log Commands---
log {(<id>|<location>)} - display log entries
---Extras---
exec <command> - execute a command in a separate process and wait
fork <command> - execute a command in a separate process
---Controlling StartLevel---
sl {(<id>|<location>)} - display the start level for the specified bundle, or for the framework if no bundle specified
setfwsl <start level> - set the framework start level
setbsl <start level> (<id>|<location>) - set the start level for the bundle(s)
setibsl <start level> - set the initial bundle start level
*
* There is a method for each command which is named '_'+method. The methods are
* invoked by a CommandInterpreter's execute method.
*/
public class FrameworkCommandProvider implements CommandProvider {
/** An instance of the OSGi framework */
private OSGi osgi;
/** The system bundle context */
private org.osgi.framework.BundleContext context;
/** The start level implementation */
private StartLevelImpl slImpl;
/** Strings used to format other strings */
private String tab = "\t";
private String newline = "\r\n";
/**
* Constructor.
*
* It registers itself as a CommandProvider with the highest ranking possible.
*
* @param osgi The current instance of OSGi
*/
public FrameworkCommandProvider(OSGi osgi) {
this.osgi = osgi;
context = osgi.getBundleContext();
slImpl = osgi.framework.startLevelImpl;
Dictionary props = new Hashtable();
props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));
context.registerService(CommandProvider.class.getName(), this, props);
}
/**
Answer a string (may be as many lines as you like) with help
texts that explain the command. This getHelp() method uses the
ConsoleMsg class to obtain the correct NLS data to display to the user.
@return The help string
*/
public String getHelp() {
StringBuffer help = new StringBuffer(1024);
help.append(newline);
help.append(ConsoleMsg.formatter.getString("CONSOLE_HELP_VALID_COMMANDS_HEADER"));
help.append(newline);
addHeader("CONSOLE_HELP_CONTROLLING_FRAMEWORK_HEADER", help);
addCommand("launch", "CONSOLE_HELP_LAUNCH_COMMAND_DESCRIPTION", help);
addCommand("shutdown", "CONSOLE_HELP_SHUTDOWN_COMMAND_DESCRIPTION", help);
addCommand("close", "CONSOLE_HELP_CLOSE_COMMAND_DESCRIPTION", help);
addCommand("exit", "CONSOLE_HELP_EXIT_COMMAND_DESCRIPTION", help);
addCommand("gc", "CONSOLE_HELP_GC_COMMAND_DESCRIPTION", help);
addCommand("init", "CONSOLE_HELP_INIT_COMMAND_DESCRIPTION", help);
addCommand("setprop", "CONSOLE_HELP_KEYVALUE_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_SETPROP_COMMAND_DESCRIPTION", help);
addHeader("CONSOLE_HELP_CONTROLLING_BUNDLES_HEADER", help);
addCommand("install", "CONSOLE_HELP_INSTALL_COMMAND_DESCRIPTION", help);
addCommand("uninstall", "CONSOLE_HELP_UNINSTALL_COMMAND_DESCRIPTION", help);
addCommand("start", "CONSOLE_HELP_START_COMMAND_DESCRIPTION", help);
addCommand("stop", "CONSOLE_HELP_STOP_COMMAND_DESCRIPTION", help);
addCommand("refresh", "CONSOLE_HELP_REFRESH_COMMAND_DESCRIPTION", help);
addCommand("update", "CONSOLE_HELP_UPDATE_COMMAND_DESCRIPTION", help);
addHeader("CONSOLE_HELP_DISPLAYING_STATUS_HEADER", help);
addCommand("status", "CONSOLE_HELP_STATUS_COMMAND_DESCRIPTION", help);
addCommand("ss", "CONSOLE_HELP_SS_COMMAND_DESCRIPTION", help);
addCommand("services", "CONSOLE_HELP_FILTER_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_SERVICES_COMMAND_DESCRIPTION", help);
addCommand("packages", "CONSOLE_HELP_PACKAGES_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_PACKAGES_COMMAND_DESCRIPTION", help);
addCommand("bundles", "CONSOLE_HELP_BUNDLES_COMMAND_DESCRIPTION", help);
addCommand("bundle", "CONSOLE_HELP_IDLOCATION_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_BUNDLE_COMMAND_DESCRIPTION", help);
addCommand("headers", "CONSOLE_HELP_IDLOCATION_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_HEADERS_COMMAND_DESCRIPTION", help);
addCommand("log", "CONSOLE_HELP_IDLOCATION_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_LOG_COMMAND_DESCRIPTION", help);
addHeader("CONSOLE_HELP_EXTRAS_HEADER", help);
addCommand("exec", "CONSOLE_HELP_COMMAND_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_EXEC_COMMAND_DESCRIPTION", help);
addCommand("fork", "CONSOLE_HELP_COMMAND_ARGUMENT_DESCRIPTION", "CONSOLE_HELP_FORK_COMMAND_DESCRIPTION", help);
addHeader("STARTLEVEL_HELP_HEADING", help);
addCommand("sl", "CONSOLE_HELP_OPTIONAL_IDLOCATION_ARGUMENT_DESCRIPTION", "STARTLEVEL_HELP_SL", help);
addCommand("setfwsl", "STARTLEVEL_ARGUMENT_DESCRIPTION", "STARTLEVEL_HELP_SETFWSL", help);
addCommand("setbsl", "STARTLEVEL_IDLOCATION_ARGUMENT_DESCRIPTION", "STARTLEVEL_HELP_SETBSL", help);
addCommand("setibsl", "STARTLEVEL_ARGUMENT_DESCRIPTION", "STARTLEVEL_HELP_SETIBSL", help);
return help.toString();
}
/** Private helper method for getHelp. Formats the help headers. */
private void addHeader(String header, StringBuffer help) {
help.append("---");
help.append(ConsoleMsg.formatter.getString(header));
help.append("---");
help.append(newline);
}
/** Private helper method for getHelp. Formats the command descriptions. */
private void addCommand(String command, String description, StringBuffer help) {
help.append(tab);
help.append(command);
help.append(" - ");
help.append(ConsoleMsg.formatter.getString(description));
help.append(newline);
}
/** Private helper method for getHelp. Formats the command descriptions with command arguements. */
private void addCommand(String command, String parameters, String description, StringBuffer help) {
help.append(tab);
help.append(command);
help.append(" ");
help.append(ConsoleMsg.formatter.getString(parameters));
help.append(" - ");
help.append(ConsoleMsg.formatter.getString(description));
help.append(newline);
}
/**
* Handle the exit command. Exit immediately (System.exit)
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _exit(CommandInterpreter intp) throws Exception {
intp.println();
System.exit(0);
}
/**
* Handle the launch command. Start the OSGi framework.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _launch(CommandInterpreter intp) throws Exception {
osgi.launch();
}
/**
* Handle the shutdown command. Shutdown the OSGi framework.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _shutdown(CommandInterpreter intp) throws Exception {
osgi.shutdown();
}
/**
* Handle the start command's abbreviation. Invoke _start()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _sta(CommandInterpreter intp) throws Exception {
_start(intp);
}
/**
* Handle the start command. Start the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _start(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
bundle.start();
}
nextArg = intp.nextArgument();
}
}
/**
* Handle the stop command's abbreviation. Invoke _stop()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _sto(CommandInterpreter intp) throws Exception {
_stop(intp);
}
/**
* Handle the stop command. Stop the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _stop(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
bundle.stop();
}
nextArg = intp.nextArgument();
}
}
/**
* Handle the install command's abbreviation. Invoke _install()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _i(CommandInterpreter intp) throws Exception {
_install(intp);
}
/**
* Handle the install command. Install and optionally start bundle from the given URL\r\n"
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _install(CommandInterpreter intp) throws Exception {
String url = intp.nextArgument();
if (url == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NOTHING_TO_INSTALL_ERROR"));
} else {
Bundle bundle = (Bundle) context.installBundle(url);
intp.print(ConsoleMsg.formatter.getString("CONSOLE_BUNDLE_ID_MESSAGE"));
intp.println(new Long(bundle.getBundleId()));
String nextArg = intp.nextArgument();
if (nextArg != null) {
String start = nextArg.toLowerCase();
if (Launcher.matchCommand("start", start, 1)) {
bundle.start();
}
}
}
}
/**
* Handle the update command's abbreviation. Invoke _update()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _up(CommandInterpreter intp) throws Exception {
_update(intp);
}
/**
* Handle the update command. Update the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _update(CommandInterpreter intp) throws Exception {
String token = intp.nextArgument();
if (token == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (token != null) {
if ("*".equals(token)) {
Bundle[] bundles = (Bundle[]) context.getBundles();
int size = bundles.length;
if (size > 0) {
for (int i = 0; i < size; i++) {
Bundle bundle = bundles[i];
if (bundle.getBundleId() != 0) {
try {
bundle.update();
} catch (BundleException e) {
intp.printStackTrace(e);
}
}
}
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_INSTALLED_BUNDLES_ERROR"));
}
} else {
Bundle bundle = getBundleFromToken(intp, token, true);
if (bundle != null) {
String source = intp.nextArgument();
try {
if (source != null) {
bundle.update(new URL(source).openStream());
} else {
bundle.update();
}
} catch (BundleException e) {
intp.printStackTrace(e);
}
}
}
token = intp.nextArgument();
}
}
/**
* Handle the uninstall command's abbreviation. Invoke _uninstall()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _un(CommandInterpreter intp) throws Exception {
_uninstall(intp);
}
/**
* Handle the uninstall command. Uninstall the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _uninstall(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
bundle.uninstall();
}
nextArg = intp.nextArgument();
}
}
/**
* Handle the status command's abbreviation. Invoke _status()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _s(CommandInterpreter intp) throws Exception {
_status(intp);
}
/**
* Handle the status command. Display installed bundles and registered services.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _status(CommandInterpreter intp) throws Exception {
if (osgi.isActive()) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_FRAMEWORK_IS_LAUNCHED_MESSAGE"));
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_FRAMEWORK_IS_SHUTDOWN_MESSAGE"));
}
intp.println();
Bundle[] bundles = (Bundle[]) context.getBundles();
int size = bundles.length;
if (size == 0) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_INSTALLED_BUNDLES_ERROR"));
return;
}
intp.print(ConsoleMsg.formatter.getString("CONSOLE_ID"));
intp.print(tab);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_BUNDLE_LOCATION_MESSAGE"));
intp.println(ConsoleMsg.formatter.getString("CONSOLE_STATE_BUNDLE_FILE_NAME_HEADER"));
for (int i = 0; i < size; i++) {
Bundle bundle = bundles[i];
intp.print(new Long(bundle.getBundleId()));
intp.print(tab);
intp.println(bundle.getLocation());
intp.print(" ");
intp.print(getStateName(bundle.getState()));
intp.println(bundle.bundledata);
}
ServiceReference[] services = (ServiceReference[]) context.getServiceReferences(null, null);
if (services != null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_REGISTERED_SERVICES_MESSAGE"));
size = services.length;
for (int i = 0; i < size; i++) {
intp.println(services[i]);
}
}
}
/**
* Handle the services command's abbreviation. Invoke _services()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _se(CommandInterpreter intp) throws Exception {
_services(intp);
}
/**
* Handle the services command. Display registered service details.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _services(CommandInterpreter intp) throws Exception {
String filter = null;
String nextArg = intp.nextArgument();
if (nextArg != null) {
StringBuffer buf = new StringBuffer();
while (nextArg != null) {
buf.append(' ');
buf.append(nextArg);
nextArg = intp.nextArgument();
}
filter = buf.toString();
}
ServiceReference[] services = (ServiceReference[]) context.getServiceReferences(null, filter);
if (services != null) {
int size = services.length;
if (size > 0) {
for (int j = 0; j < size; j++) {
ServiceReference service = services[j];
intp.println(service);
intp.print(" ");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_REGISTERED_BY_BUNDLE_MESSAGE"));
intp.print(" ");
intp.println(service.getBundle());
Bundle[] users = (Bundle[]) service.getUsingBundles();
if (users != null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_BUNDLES_USING_SERVICE_MESSAGE"));
for (int k = 0; k < users.length; k++) {
intp.print(" ");
intp.println(users[k]);
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLES_USING_SERVICE_MESSAGE"));
}
}
return;
}
}
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_REGISTERED_SERVICES_MESSAGE"));
}
/**
* Handle the packages command's abbreviation. Invoke _packages()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _p(CommandInterpreter intp) throws Exception {
_packages(intp);
}
/**
* Handle the packages command. Display imported/exported package details.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _packages(CommandInterpreter intp) throws Exception {
org.osgi.framework.Bundle bundle = null;
String token = intp.nextArgument();
if (token != null) {
bundle = getBundleFromToken(intp, token, false);
}
org.osgi.framework.ServiceReference packageAdminRef = context.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
if (packageAdminRef != null) {
org.osgi.service.packageadmin.PackageAdmin packageAdmin = (org.osgi.service.packageadmin.PackageAdmin) context.getService(packageAdminRef);
if (packageAdmin != null) {
try {
org.osgi.service.packageadmin.ExportedPackage[] packages = null;
if ((token != null) && (bundle == null)) {
org.osgi.service.packageadmin.ExportedPackage pkg = packageAdmin.getExportedPackage(token);
if (pkg != null) {
packages = new org.osgi.service.packageadmin.ExportedPackage[] { pkg };
}
} else {
packages = packageAdmin.getExportedPackages(bundle);
}
if (packages == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_EXPORTED_PACKAGES_MESSAGE"));
} else {
for (int i = 0; i < packages.length; i++) {
org.osgi.service.packageadmin.ExportedPackage pkg = packages[i];
intp.print(pkg);
boolean removalPending = pkg.isRemovalPending();
if (removalPending) {
intp.print("(");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_REMOVAL_PENDING_MESSAGE"));
intp.println(")");
}
org.osgi.framework.Bundle exporter = pkg.getExportingBundle();
if (exporter != null) {
intp.print("<");
intp.print(exporter);
intp.println(">");
org.osgi.framework.Bundle[] importers = pkg.getImportingBundles();
for (int j = 0; j < importers.length; j++) {
intp.print(" ");
intp.print(importers[j]);
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_IMPORTS_MESSAGE"));
}
} else {
intp.print("<");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_STALE_MESSAGE"));
intp.println(">");
}
}
}
} finally {
context.ungetService(packageAdminRef);
}
}
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_EXPORTED_PACKAGES_NO_PACKAGE_ADMIN_MESSAGE"));
}
}
/**
* Handle the bundles command. Display details for all installed bundles.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _bundles(CommandInterpreter intp) throws Exception {
Bundle[] bundles = (Bundle[]) context.getBundles();
int size = bundles.length;
if (size == 0) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_INSTALLED_BUNDLES_ERROR"));
return;
}
for (int i = 0; i < size; i++) {
Bundle bundle = bundles[i];
long id = bundle.getBundleId();
intp.println(bundle);
intp.print(" ");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_ID_MESSAGE", String.valueOf(id)));
intp.print(", ");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_STATUS_MESSAGE", getStateName(bundle.getState())));
if (id != 0) {
File dataRoot = osgi.framework.getDataFile(bundle, "");
String root = (dataRoot == null) ? null : dataRoot.getAbsolutePath();
intp.print(ConsoleMsg.formatter.getString("CONSOLE_DATA_ROOT_MESSAGE", root));
} else {
intp.println();
}
ServiceReference[] services = (ServiceReference[]) bundle.getRegisteredServices();
if (services != null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_REGISTERED_SERVICES_MESSAGE"));
for (int j = 0; j < services.length; j++) {
intp.print(" ");
intp.println(services[j]);
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_REGISTERED_SERVICES_MESSAGE"));
}
services = (ServiceReference[]) bundle.getServicesInUse();
if (services != null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_SERVICES_IN_USE_MESSAGE"));
for (int j = 0; j < services.length; j++) {
intp.print(" ");
intp.println(services[j]);
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_SERVICES_IN_USE_MESSAGE"));
}
}
}
/**
* Handle the bundle command's abbreviation. Invoke _bundle()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _b(CommandInterpreter intp) throws Exception {
_bundle(intp);
}
/**
* Handle the bundle command. Display details for the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _bundle(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
long id = bundle.getBundleId();
intp.println(bundle);
intp.print(" ");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_ID_MESSAGE", String.valueOf(id)));
intp.print(", ");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_STATUS_MESSAGE", getStateName(bundle.getState())));
if (id != 0) {
File dataRoot = osgi.framework.getDataFile(bundle, "");
String root = (dataRoot == null) ? null : dataRoot.getAbsolutePath();
intp.print(ConsoleMsg.formatter.getString("CONSOLE_DATA_ROOT_MESSAGE", root));
} else {
intp.println();
}
ServiceReference[] services = (ServiceReference[]) bundle.getRegisteredServices();
if (services != null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_REGISTERED_SERVICES_MESSAGE"));
for (int j = 0; j < services.length; j++) {
intp.print(" ");
intp.println(services[j]);
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_REGISTERED_SERVICES_MESSAGE"));
}
services = (ServiceReference[]) bundle.getServicesInUse();
if (services != null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_SERVICES_IN_USE_MESSAGE"));
for (int j = 0; j < services.length; j++) {
intp.print(" ");
intp.println(services[j]);
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_SERVICES_IN_USE_MESSAGE"));
}
org.osgi.framework.ServiceReference packageAdminRef = context.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
if (packageAdminRef != null) {
org.osgi.service.packageadmin.PackageAdmin packageAdmin = (org.osgi.service.packageadmin.PackageAdmin) context.getService(packageAdminRef);
if (packageAdmin != null) {
try {
org.osgi.service.packageadmin.ExportedPackage exportedpkgs[] = packageAdmin.getExportedPackages(null);
if (exportedpkgs == null) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_EXPORTED_PACKAGES_MESSAGE"));
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_IMPORTED_PACKAGES_MESSAGE"));
} else {
boolean title = true;
for (int i = 0; i < exportedpkgs.length; i++) {
org.osgi.service.packageadmin.ExportedPackage exportedpkg = exportedpkgs[i];
if (exportedpkg.getExportingBundle() == bundle) {
if (title) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_EXPORTED_PACKAGES_MESSAGE"));
title = false;
}
intp.print(" ");
intp.print(exportedpkg);
if (exportedpkg.isRemovalPending()) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_EXPORTED_REMOVAL_PENDING_MESSAGE"));
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_EXPORTED_MESSAGE"));
}
}
}
if (title) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_EXPORTED_PACKAGES_MESSAGE"));
}
title = true;
for (int i = 0; i < exportedpkgs.length; i++) {
org.osgi.service.packageadmin.ExportedPackage exportedpkg = exportedpkgs[i];
org.osgi.framework.Bundle[] importers = exportedpkg.getImportingBundles();
for (int j = 0; j < importers.length; j++) {
if (importers[j] == bundle) {
if (title) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_IMPORTED_PACKAGES_MESSAGE"));
title = false;
}
intp.print(" ");
intp.print(exportedpkg);
org.osgi.framework.Bundle exporter = exportedpkg.getExportingBundle();
if (exporter != null) {
intp.print("<");
intp.print(exporter);
intp.println(">");
} else {
intp.print("<");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_STALE_MESSAGE"));
intp.println(">");
}
break;
}
}
}
if (title) {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_IMPORTED_PACKAGES_MESSAGE"));
}
}
} finally {
context.ungetService(packageAdminRef);
}
}
} else {
intp.print(" ");
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_EXPORTED_PACKAGES_NO_PACKAGE_ADMIN_MESSAGE"));
}
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ProtectionDomain domain = bundle.getProtectionDomain();
intp.println(domain);
}
}
nextArg = intp.nextArgument();
}
}
/**
* Handle the log command's abbreviation. Invoke _log()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _l(CommandInterpreter intp) throws Exception {
_log(intp);
}
/**
* Handle the log command. Display log entries.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _log(CommandInterpreter intp) throws Exception {
long logid = -1;
String token = intp.nextArgument();
if (token != null) {
Bundle bundle = getBundleFromToken(intp, token, false);
if (bundle == null) {
try {
logid = Long.parseLong(token);
} catch (NumberFormatException e) {
return;
}
} else {
logid = bundle.getBundleId();
}
}
org.osgi.framework.ServiceReference logreaderRef = context.getServiceReference("org.osgi.service.log.LogReaderService");
if (logreaderRef != null) {
Object logreader = context.getService(logreaderRef);
if (logreader != null) {
try {
Enumeration logentries = (Enumeration) (logreader.getClass().getMethod("getLog", null).invoke(logreader, null));
if (logentries.hasMoreElements()) {
Object logentry = logentries.nextElement();
Class clazz = logentry.getClass();
Method getBundle = clazz.getMethod("getBundle", null);
Method getLevel = clazz.getMethod("getLevel", null);
Method getMessage = clazz.getMethod("getMessage", null);
Method getServiceReference = clazz.getMethod("getServiceReference", null);
Method getException = clazz.getMethod("getException", null);
while (true) {
Bundle bundle = (Bundle) getBundle.invoke(logentry, null);
if ((logid == -1) || ((bundle != null) && (logid == bundle.getBundleId()))) {
Integer level = (Integer) getLevel.invoke(logentry, null);
switch (level.intValue()) {
case 4 :
intp.print(">");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_DEBUG_MESSAGE"));
intp.print(" ");
break;
case 3 :
intp.print(">");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_INFO_MESSAGE"));
intp.print(" ");
break;
case 2 :
intp.print(">");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_WARNING_MESSAGE"));
intp.print(" ");
break;
case 1 :
intp.print(">");
intp.print(ConsoleMsg.formatter.getString("CONSOLE_ERROR_MESSAGE"));
intp.print(" ");
break;
default :
intp.print(">");
intp.print(level);
intp.print(" ");
break;
}
if (bundle != null) {
intp.print("[");
intp.print(new Long(bundle.getBundleId()));
intp.print("] ");
}
intp.print(getMessage.invoke(logentry, null));
intp.print(" ");
ServiceReference svcref = (ServiceReference) getServiceReference.invoke(logentry, null);
if (svcref != null) {
intp.print("{");
intp.print(Constants.SERVICE_ID);
intp.print("=");
intp.print(svcref.getProperty(Constants.SERVICE_ID).toString());
intp.println("}");
} else {
if (bundle != null) {
intp.println(bundle.getLocation());
} else {
intp.println();
}
}
Throwable t = (Throwable) getException.invoke(logentry, null);
if (t != null) {
intp.printStackTrace(t);
}
}
if (logentries.hasMoreElements()) {
logentry = logentries.nextElement();
} else {
break;
}
}
}
} finally {
context.ungetService(logreaderRef);
}
return;
}
}
intp.println(ConsoleMsg.formatter.getString("CONSOLE_LOGSERVICE_NOT_REGISTERED_MESSAGE"));
}
/**
* Handle the gc command. Perform a garbage collection.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _gc(CommandInterpreter intp) throws Exception {
long before = Runtime.getRuntime().freeMemory();
/* Let the finilizer finish its work and remove objects from its queue */
System.gc(); /* asyncronous garbage collector might already run */
System.gc(); /* to make sure it does a full gc call it twice */
System.runFinalization();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
long after = Runtime.getRuntime().freeMemory();
intp.print(ConsoleMsg.formatter.getString("CONSOLE_FREE_MEMORY_BEFORE_GARBAGE_COLLECTION_MESSAGE"));
intp.println(String.valueOf(before));
intp.print(ConsoleMsg.formatter.getString("CONSOLE_FREE_MEMORY_AFTER_GARBAGE_COLLECTION_MESSAGE"));
intp.println(String.valueOf(after));
intp.print(ConsoleMsg.formatter.getString("CONSOLE_MEMORY_GAINED_WITH_GARBAGE_COLLECTION_MESSAGE"));
intp.println(String.valueOf(after - before));
}
/**
* Handle the init command. Uninstall all bundles.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _init(CommandInterpreter intp) throws Exception {
if (osgi.isActive()) {
intp.print(newline);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_FRAMEWORK_LAUNCHED_PLEASE_SHUTDOWN_MESSAGE"));
return;
}
Bundle[] bundles = (Bundle[]) context.getBundles();
int size = bundles.length;
if (size > 0) {
for (int i = 0; i < size; i++) {
Bundle bundle = bundles[i];
if (bundle.getBundleId() != 0) {
try {
bundle.uninstall();
} catch (BundleException e) {
intp.printStackTrace(e);
}
}
}
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_INSTALLED_BUNDLES_ERROR"));
}
}
/**
* Handle the close command. Shutdown and exit.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _close(CommandInterpreter intp) throws Exception {
intp.println();
osgi.close();
System.exit(0);
}
/**
* Handle the refresh command's abbreviation. Invoke _refresh()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _r(CommandInterpreter intp) throws Exception {
_refresh(intp);
}
/**
* Handle the refresh command. Refresh the packages of the specified bundles.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _refresh(CommandInterpreter intp) throws Exception {
org.osgi.framework.ServiceReference packageAdminRef = context.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
if (packageAdminRef != null) {
org.osgi.service.packageadmin.PackageAdmin packageAdmin = (org.osgi.service.packageadmin.PackageAdmin) context.getService(packageAdminRef);
if (packageAdmin != null) {
try {
Bundle[] refresh = null;
String token = intp.nextArgument();
if (token != null) {
Vector bundles = new Vector();
while (token != null) {
Bundle bundle = getBundleFromToken(intp, token, true);
if (bundle != null) {
bundles.addElement(bundle);
}
token = intp.nextArgument();
}
int size = bundles.size();
if (size == 0) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_INVALID_BUNDLE_SPECIFICATION_ERROR"));
return;
}
refresh = new Bundle[size];
bundles.copyInto(refresh);
}
packageAdmin.refreshPackages(refresh);
} finally {
context.ungetService(packageAdminRef);
}
}
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_CAN_NOT_REFRESH_NO_PACKAGE_ADMIN_ERROR"));
}
}
/**
* Executes the given system command in a separate system process
* and waits for it to finish.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _exec(CommandInterpreter intp) throws Exception {
String command = intp.nextArgument();
if (command == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_COMMAND_SPECIFIED_ERROR"));
return;
}
Process p = Runtime.getRuntime().exec(command);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_STARTED_IN_MESSAGE", command, String.valueOf(p)));
int result = p.waitFor();
intp.println(ConsoleMsg.formatter.getString("CONSOLE_EXECUTED_RESULT_CODE_MESSAGE", command, String.valueOf(result)));
}
/**
* Executes the given system command in a separate system process. It does
* not wait for a result.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _fork(CommandInterpreter intp) throws Exception {
String command = intp.nextArgument();
if (command == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_COMMAND_SPECIFIED_ERROR"));
return;
}
Process p = Runtime.getRuntime().exec(command);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_STARTED_IN_MESSAGE", command, String.valueOf(p)));
}
/**
* Handle the headers command's abbreviation. Invoke _headers()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _h(CommandInterpreter intp) throws Exception {
_headers(intp);
}
/**
* Handle the headers command. Display headers for the specified bundle(s).
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _headers(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
intp.printDictionary(bundle.getHeaders(), ConsoleMsg.formatter.getString("CONSOLE_BUNDLE_HEADERS_TITLE"));
intp.printBundleResource(bundle, "META-INF/IVEATTRS.XML");
intp.printBundleResource(bundle, "META-INF/IVERES.XML");
}
nextArg = intp.nextArgument();
}
}
/**
* Prints the the meta data of bundles.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _meta(CommandInterpreter intp) throws Exception {
String nextArg = intp.nextArgument();
if (nextArg == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_BUNDLE_SPECIFIED_ERROR"));
}
/* TODO figure out if we can remove the meta command.
while (nextArg != null) {
Bundle bundle = getBundleFromToken(intp, nextArg, true);
if (bundle != null) {
intp.printDictionary(bundle.getMetadata(), bundle.toString());
}
nextArg = intp.nextArgument();
}
*/
}
/**
* Handles the props command's abbreviation. Invokes _props()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _pr(CommandInterpreter intp) throws Exception {
_props(intp);
}
/**
* Handles the _props command. Prints the system properties sorted.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _props(CommandInterpreter intp) throws Exception {
intp.printDictionary(System.getProperties(), ConsoleMsg.formatter.getString("CONSOLE_SYSTEM_PROPERTIES_TITLE"));
}
/**
* Handles the setprop command's abbreviation. Invokes _setprop()
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _setp(CommandInterpreter intp) throws Exception {
_setprop(intp);
}
/**
* Handles the setprop command. Sets the CDS property in the given argument.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _setprop(CommandInterpreter intp) throws Exception {
String argument = intp.nextArgument();
if (argument == null) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_PARAMETERS_SPECIFIED_TITLE"));
_props(intp);
} else {
InputStream in = new ByteArrayInputStream(argument.getBytes());
try {
Properties sysprops = System.getProperties();
Properties newprops = new Properties();
newprops.load(in);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_SETTING_PROPERTIES_TITLE"));
Enumeration keys = newprops.propertyNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = (String) newprops.get(key);
sysprops.put(key, value);
intp.println(tab + key + " = " + value);
}
} catch (IOException e) {
} finally {
try {
in.close();
} catch (IOException e) {
}
}
}
}
/**
* Prints the short version of the status.
* For the long version use "status".
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _ss(CommandInterpreter intp) throws Exception {
if (osgi.isActive()) {
intp.println();
intp.println(ConsoleMsg.formatter.getString("CONSOLE_FRAMEWORK_IS_LAUNCHED_MESSAGE"));
} else {
intp.println();
intp.println(ConsoleMsg.formatter.getString("CONSOLE_FRAMEWORK_IS_SHUTDOWN_MESSAGE"));
}
Bundle[] bundles = (Bundle[]) context.getBundles();
if (bundles.length == 0) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_NO_INSTALLED_BUNDLES_ERROR"));
} else {
intp.print(newline);
intp.print(ConsoleMsg.formatter.getString("CONSOLE_ID"));
intp.print(tab);
intp.print(ConsoleMsg.formatter.getString("CONSOLE_TYPE"));
intp.print(tab);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_STATE_BUNDLE_TITLE"));
for (int i = 0; i < bundles.length; i++) {
Bundle b = (Bundle) bundles[i];
String type = " ";
// :TODO need to determine the type?
intp.println(b.getBundleId() + "\t" + type + " \t" + getStateName(b.getState()) + b);
if (b.isFragment()) {
Bundle master = (Bundle) b.getHost();
if (master != null)
intp.println("\t\tMaster=" + master.getBundleId());
} else {
Bundle fragment;
org.osgi.framework.Bundle fragments[] = b.getFragments();
if (fragments != null) {
for (int f = 0; f < fragments.length; f++) {
fragment = (Bundle) fragments[f];
intp.println("\t\tFragment=" + fragment.getBundleId());
}
}
}
}
}
}
/**
* Handles the threads command abbreviation. Invokes _threads().
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _t(CommandInterpreter intp) throws Exception {
_threads(intp);
}
/**
* Prints the information about the currently running threads
* in the embedded system.
*
* @param intp A CommandInterpreter object containing the command
* and it's arguments.
*/
public void _threads(CommandInterpreter intp) throws Exception {
ThreadGroup[] threadGroups = getThreadGroups();
Util.sort(threadGroups);
ThreadGroup tg = getTopThreadGroup();
Thread[] threads = new Thread[tg.activeCount()];
int count = tg.enumerate(threads, true);
Util.sort(threads);
StringBuffer sb = new StringBuffer(120);
intp.println();
intp.println(ConsoleMsg.formatter.getString("CONSOLE_THREADGROUP_TITLE"));
for (int i = 0; i < threadGroups.length; i++) {
tg = threadGroups[i];
int all = tg.activeCount(); //tg.allThreadsCount();
int local = tg.enumerate(new Thread[all], false); //tg.threadsCount();
ThreadGroup p = tg.getParent();
String parent = (p == null) ? "-none-" : p.getName();
sb.setLength(0);
sb.append(Util.toString(simpleClassName(tg), 18)).append(" ").append(Util.toString(tg.getName(), 21)).append(" ").append(Util.toString(parent, 16)).append(Util.toString(new Integer(tg.getMaxPriority()), 3)).append(Util.toString(new Integer(local), 4)).append("/").append(Util.toString(String.valueOf(all), 6));
intp.println(sb.toString());
}
intp.print(newline);
intp.println(ConsoleMsg.formatter.getString("CONSOLE_THREADTYPE_TITLE"));
for (int j = 0; j < count; j++) {
Thread t = threads[j];
if (t != null) {
sb.setLength(0);
sb.append(Util.toString(simpleClassName(t), 18)).append(" ").append(Util.toString(t.getName(), 21)).append(" ").append(Util.toString(t.getThreadGroup().getName(), 16)).append(Util.toString(new Integer(t.getPriority()), 3));
intp.println(sb.toString());
}
}
}
/**
* Handles the sl (startlevel) command.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _sl(CommandInterpreter intp) throws Exception {
if (isStartLevelSvcPresent(intp)) {
org.osgi.framework.Bundle bundle = null;
String token = intp.nextArgument();
int value = 0;
if (token != null) {
bundle = getBundleFromToken(intp, token, true);
if (bundle == null) {
return;
}
}
if (bundle == null) { // must want framework startlevel
value = slImpl.getStartLevel();
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_FRAMEWORK_ACTIVE_STARTLEVEL", value));
} else { // must want bundle startlevel
value = slImpl.getBundleStartLevel(bundle);
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_BUNDLE_STARTLEVEL", new Long(bundle.getBundleId()), new Integer(value)));
}
}
}
/**
* Handles the setfwsl (set framework startlevel) command.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _setfwsl(CommandInterpreter intp) throws Exception {
if (isStartLevelSvcPresent(intp)) {
int value = 0;
String token = intp.nextArgument();
if (token == null) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_NO_STARTLEVEL_GIVEN"));
value = slImpl.getStartLevel();
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_FRAMEWORK_ACTIVE_STARTLEVEL", value));
} else {
value = this.getStartLevelFromToken(intp, token);
if (value > 0) {
try {
slImpl.setStartLevel(value);
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_FRAMEWORK_ACTIVE_STARTLEVEL", value));
} catch (IllegalArgumentException e) {
intp.println(e.getMessage());
}
}
}
}
}
/**
* Handles the setbsl (set bundle startlevel) command.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _setbsl(CommandInterpreter intp) throws Exception {
if (isStartLevelSvcPresent(intp)) {
String token;
Bundle bundle = null;
token = intp.nextArgument();
if (token == null) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_NO_STARTLEVEL_OR_BUNDLE_GIVEN"));
return;
}
int newSL = this.getStartLevelFromToken(intp, token);
token = intp.nextArgument();
if (token == null) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_NO_STARTLEVEL_OR_BUNDLE_GIVEN"));
return;
}
while (token != null) {
bundle = getBundleFromToken(intp, token, true);
if (bundle != null) {
try {
slImpl.setBundleStartLevel(bundle, newSL);
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_BUNDLE_STARTLEVEL", new Long(bundle.getBundleId()), new Integer(newSL)));
} catch (IllegalArgumentException e) {
intp.println(e.getMessage());
}
}
token = intp.nextArgument();
}
}
}
/**
* Handles the setibsl (set initial bundle startlevel) command.
*
* @param intp A CommandInterpreter object containing the command and it's arguments.
*/
public void _setibsl(CommandInterpreter intp) throws Exception {
if (isStartLevelSvcPresent(intp)) {
int value = 0;
String token = intp.nextArgument();
if (token == null) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_NO_STARTLEVEL_GIVEN"));
value = slImpl.getInitialBundleStartLevel();
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_INITIAL_BUNDLE_STARTLEVEL", value));
} else {
value = this.getStartLevelFromToken(intp, token);
if (value > 0) {
try {
slImpl.setInitialBundleStartLevel(value);
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_INITIAL_BUNDLE_STARTLEVEL", value));
} catch (IllegalArgumentException e) {
intp.println(e.getMessage());
}
}
}
}
}
/**
* Checks for the presence of the StartLevel Service. Outputs a message if it is not present.
* @param intp The CommandInterpreter object to be used to write to the console
* @return true or false if service is present or not
*/
protected boolean isStartLevelSvcPresent(CommandInterpreter intp) {
boolean retval = false;
org.osgi.framework.ServiceReference slSvcRef = context.getServiceReference("org.osgi.service.startlevel.StartLevel");
if (slSvcRef != null) {
org.osgi.service.startlevel.StartLevel slSvc = (org.osgi.service.startlevel.StartLevel) context.getService(slSvcRef);
if (slSvc != null) {
retval = true;
}
} else {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_CAN_NOT_USE_STARTLEVEL_NO_STARTLEVEL_SVC_ERROR"));
}
return retval;
}
/**
* Given a number, retrieve the Bundle object with that id.
*
* @param A string containing a potential bundle it
* @param A boolean indicating whether or not to output a message
* @return The requested Bundle object
*/
protected Bundle getBundleFromToken(CommandInterpreter intp, String token, boolean error) {
Bundle bundle;
try {
long id = Long.parseLong(token);
bundle = (Bundle) context.getBundle(id);
} catch (NumberFormatException nfe) {
bundle = ((BundleContext) context).getBundleByLocation(token);
}
if ((bundle == null) && error) {
intp.println(ConsoleMsg.formatter.getString("CONSOLE_CANNOT_FIND_BUNDLE_ERROR", token));
}
return (bundle);
}
/**
* Given a string containing a startlevel value, validate it and convert it to an int
*
* @param A CommandInterpreter object used for printing out error messages
* @param A string containing a potential startlevel
* @return The start level or an int <0 if it was invalid
*/
protected int getStartLevelFromToken(CommandInterpreter intp, String value) {
int retval = -1;
try {
retval = Integer.parseInt(value);
if (Integer.parseInt(value) <= 0) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_POSITIVE_INTEGER"));
}
} catch (NumberFormatException nfe) {
intp.println(ConsoleMsg.formatter.getString("STARTLEVEL_POSITIVE_INTEGER"));
}
return retval;
}
/**
* Given a state value, return the string describing that state.
*
* @param An int containing a state value
* @return A String describing the state
*/
protected String getStateName(int state) {
switch (state) {
case Bundle.UNINSTALLED :
return (ConsoleMsg.formatter.getString("CONSOLE_UNINSTALLED_MESSAGE"));
case Bundle.INSTALLED :
return (ConsoleMsg.formatter.getString("CONSOLE_INSTALLED_MESSAGE"));
case Bundle.RESOLVED :
return (ConsoleMsg.formatter.getString("CONSOLE_RESOLVED_MESSAGE"));
case Bundle.STARTING :
return (ConsoleMsg.formatter.getString("CONSOLE_STARTING_MESSAGE"));
case Bundle.STOPPING :
return (ConsoleMsg.formatter.getString("CONSOLE_STOPPING_MESSAGE"));
case Bundle.ACTIVE :
return (ConsoleMsg.formatter.getString("CONSOLE_ACTIVE_MESSAGE"));
default :
return (Integer.toHexString(state));
}
}
/**
* Answers all thread groups in the system.
*
* @return An array of all thread groups.
*/
protected ThreadGroup[] getThreadGroups() {
ThreadGroup tg = getTopThreadGroup();
ThreadGroup[] groups = new ThreadGroup[tg.activeGroupCount()];
int count = tg.enumerate(groups, true);
if (count == groups.length) {
return groups;
}
// get rid of null entries
ThreadGroup[] ngroups = new ThreadGroup[count];
System.arraycopy(groups, 0, ngroups, 0, count);
return ngroups;
}
/**
* Answers the top level group of the current thread.
* <p>
* It is the 'system' or 'main' thread group under
* which all 'user' thread groups are allocated.
*
* @return The parent of all user thread groups.
*/
protected ThreadGroup getTopThreadGroup() {
ThreadGroup topGroup = Thread.currentThread().getThreadGroup();
if (topGroup != null) {
while (topGroup.getParent() != null) {
topGroup = topGroup.getParent();
}
}
return topGroup;
}
/**
* Returns the simple class name of an object.
*
* @param The object for which a class name is requested
* @return The simple class name.
*/
public String simpleClassName(Object o) {
java.util.StringTokenizer t = new java.util.StringTokenizer(o.getClass().getName(), ".");
int ct = t.countTokens();
for (int i = 1; i < ct; i++) {
t.nextToken();
}
return t.nextToken();
}
}