blob: d2c34f1fb6816086491a84fd5ee812a5ef07050a [file] [log] [blame]
package aQute.shell.equinox;
import java.io.*;
import java.net.*;
import java.util.*;
import org.osgi.framework.*;
import org.osgi.service.command.*;
import org.osgi.service.component.*;
import org.osgi.service.log.*;
import org.osgi.service.packageadmin.*;
import org.osgi.service.startlevel.*;
public class Equinox implements Converter {
BundleContext context;
PackageAdmin pka;
LogReaderService lrs;
StartLevel sls;
final static String[] functions = { "active", "bundles", "close", "diag",
"exec", "exit", "fork", "gc", "getprop", "headers", "init",
"install", "launch", "log", "packages", "packages", "refresh",
"services", "setbsl", "setfwsl", "setibsl", "setprop", "shutdown",
"sl", "ss", "start", "status", "stop", "uninstall", "update" };
protected void activate(ComponentContext context) {
this.context = context.getBundleContext();
Dictionary<String, Object> dict = new Hashtable<String, Object>();
dict.put(CommandProcessor.COMMAND_SCOPE, "eqx");
dict.put(CommandProcessor.COMMAND_FUNCTION, functions);
this.context.registerService( Converter.class.getName(), this, dict);
}
BundleContext getContext() {
return context;
}
public void setPka(PackageAdmin pka) {
this.pka = pka;
}
public void setLrs(LogReaderService lrs) {
this.lrs = lrs;
}
public void setSls(StartLevel sls) {
this.sls = sls;
}
/**
* - Displays unsatisfied constraints for the specified bundle(s).
*/
public void diag() {
}
/*
* active - Displays a list of all bundles currently in the ACTIVE state.
*/
public List<Bundle> active() {
List<Bundle> result = new ArrayList<Bundle>();
Bundle[] bundles = getContext().getBundles();
for (Bundle b : bundles) {
if (b.getState() == Bundle.ACTIVE)
result.add(b);
}
return result;
}
/*
* getprop { name } - Displays the system properties with the given name, or
* all of them.
*/
public Object getprop(CharSequence name) {
if (name == null)
return System.getProperties();
else
return System.getProperty(name.toString());
}
/**
* launch - start the OSGi Framework
*/
public void launch() {
throw new IllegalStateException("Already running");
}
/**
* shutdown - shutdown the OSGi Framework
*/
public void shutdown() throws BundleException {
getContext().getBundle().stop();
}
/**
* close - shutdown and exit
*/
public void close(CommandSession session) {
session.close();
}
/**
* exit - exit immediately (System.exit)
*/
public void exit(int exitValue) {
exit(exitValue);
}
/**
* gc - perform a garbage collection
*/
public long gc() {
Runtime.getRuntime().gc();
return Runtime.getRuntime().freeMemory();
}
/**
* init - uninstall all bundles
*/
public void init() throws Exception {
Bundle bundles[] = getContext().getBundles();
for (Bundle b : bundles)
if (b.getBundleId() != 0)
b.uninstall();
}
/**
* setprop <key>=<value> - set the OSGi property
*/
public void setprop(CommandSession session, String key, String value) {
session.put(key, value);
}
/**
* install - install and optionally start bundle from the given URL
*
* @throws BundleException
*/
public Bundle install(URL url) throws BundleException {
return getContext().installBundle(url.toExternalForm());
}
/**
* uninstall - uninstall the specified bundle(s)
*
* @throws BundleException
*/
public void uninstall(Bundle[] bundles) throws BundleException {
for (Bundle b : bundles) {
b.uninstall();
}
}
/**
* start - start the specified bundle(s)
*/
public void start(Bundle[] bundles) throws BundleException {
for (Bundle b : bundles) {
b.start();
}
}
/**
* stop - stop the specified bundle(s)
*/
public void stop(Bundle[] bundles) throws BundleException {
for (Bundle b : bundles) {
b.stop();
}
}
/**
* refresh - refresh the packages of the specified bundles
*/
public void refresh(Bundle[] bundles) throws Exception {
if (pka != null)
pka.refreshPackages(bundles);
else
throw new RuntimeException("No PackageAdmin service registered");
}
/**
* update - update the specified bundle(s)
*/
public void update(Bundle[] bundles) throws BundleException {
for (Bundle b : bundles) {
b.update();
}
}
/**
* status - display installed bundles and registered services
*/
public List<Object> status() throws Exception {
List<Object> status = new ArrayList<Object>();
status.addAll(Arrays.asList(getContext().getBundles()));
status.addAll(Arrays.asList(getContext().getServiceReferences(null,
null)));
return status;
}
/**
* ss - display installed bundles (short status)
*/
public Bundle[] ss() {
return getContext().getBundles();
}
/**
* services {filter} - display registered service details
*/
public ServiceReference[] services(String filter) throws Exception {
return getContext().getServiceReferences(null, filter);
}
/**
* packages {<pkgname>|<id>|<location>} - display imported/exported
* package details
*/
public ExportedPackage[] packages(Bundle bundle) throws Exception {
if (pka != null)
return pka.getExportedPackages(bundle);
else
throw new RuntimeException("No PackageAdmin service registered");
}
public ExportedPackage[] packages(String packageName) throws Exception {
if (pka != null)
return pka.getExportedPackages(packageName);
return null;
}
/**
* bundles - display details for all installed bundles
*/
public Bundle[] bundles() {
return ss();
}
/**
* bundle (<id>|<location>) - display details for the specified bundle(s)
*/
/**
* headers (<id>|<location>) - print bundle headers
*/
@SuppressWarnings("unchecked")
public Dictionary headers(Bundle b, String locale) {
return b.getHeaders(locale);
}
/**
* log (<id>|<location>) - display log entries
*/
@SuppressWarnings("unchecked")
public Collection<LogEntry> log(Bundle bundle) throws Exception {
if (lrs != null)
return Collections.list((Enumeration<LogEntry>) lrs.getLog());
else
throw new RuntimeException("LogReader not available");
}
/**
* exec <command> - execute a command in a separate process and wait
*
* @throws IOException
*/
public int exec(Object[] args, boolean fork) throws IOException {
StringBuffer sb = new StringBuffer();
String del = "";
for (Object arg : args) {
sb.append(del);
sb.append(arg);
del = " ";
}
Process p = Runtime.getRuntime().exec(sb.toString());
if (fork) {
int c;
while ((c = p.getInputStream().read()) > 0)
System.out.print(c);
}
return p.exitValue();
}
/**
* fork <command> - execute a command in a separate process
*/
public void fork(Object args[]) throws Exception {
exec(args, true);
}
/**
* sl {(<id>|<location>)} - display the start level for the specified
* bundle, or for the framework if no bundle specified
*/
public int sl(Bundle b) throws Exception {
if (sls == null)
throw new RuntimeException("No StartLevel service registered");
if (b == null)
return sls.getStartLevel();
else
return sls.getBundleStartLevel(b);
}
/**
* setfwsl <start level> - set the framework start level
*/
public int setfwsl(int n) throws Exception {
if (sls == null)
throw new RuntimeException("No StartLevel service registered");
int old = sls.getStartLevel();
sls.setStartLevel(n);
return old;
}
/**
* setbsl <start level> (<id>|<location>) - set the start level for the
* bundle(s)
*/
public int setbsl(Bundle b, int n) throws Exception {
if (sls == null)
throw new RuntimeException("No StartLevel service registered");
int old = sls.getBundleStartLevel(b);
sls.setBundleStartLevel(b, n);
return old;
}
/**
* setibsl <start level> - set the initial bundle start level
*/
public int setibsl(int n) throws Exception {
if (sls == null)
throw new RuntimeException("No StartLevel service registered");
int old = sls.getInitialBundleStartLevel();
sls.setInitialBundleStartLevel(n);
return old;
}
public Object convert(Class<?> desiredType, Object in) throws Exception {
return null;
}
String getLevel(int index) {
switch (index) {
case LogService.LOG_DEBUG:
return "DEBUG";
case LogService.LOG_INFO:
return "INFO ";
case LogService.LOG_WARNING:
return "WARNI";
case LogService.LOG_ERROR:
return "ERROR";
default:
return "<" + index + ">";
}
}
public CharSequence format(Object target, int level, Converter escape) {
if (target instanceof LogEntry) {
LogEntry entry = (LogEntry) target;
switch (level) {
case LINE:
Formatter f = new Formatter();
f.format("%tT %04d %s %s", entry.getTime(), entry.getBundle()
.getBundleId(), getLevel(entry.getLevel())+"", entry
.getMessage()+"");
return f.toString();
case PART:
Formatter f2 = new Formatter();
f2.format("%tT %s", entry.getTime(), entry
.getMessage());
return f2.toString();
}
}
return null;
}
/**
* profilelog - Display & flush the profile log messages
*/
}