Initial commit of OSGi Shell contribution. (FELIX-946)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@783826 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/gogo/src/aQute/shell/equinox/Equinox.java b/gogo/src/aQute/shell/equinox/Equinox.java
new file mode 100644
index 0000000..d2c34f1
--- /dev/null
+++ b/gogo/src/aQute/shell/equinox/Equinox.java
@@ -0,0 +1,389 @@
+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
+ */
+
+}