org.eclipse.virgo.ide.management.remote.StandardBundleAdmin.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.virgo.ide.management.remote.StandardBundleAdmin.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2012 SpringSource, a divison of VMware, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SpringSource, a divison of VMware, Inc. - initial API and implementation
 *     SAP AG - support for new equinox console
 *******************************************************************************/

package org.eclipse.virgo.ide.management.remote;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringBufferInputStream;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.eclipse.gemini.blueprint.util.OsgiServiceReferenceUtils;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
import org.eclipse.osgi.service.resolver.PlatformAdmin;
import org.eclipse.virgo.ide.management.remote.ServiceReference.Type;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;

/**
 * @author Christian Dupuis
 */
@ManagedResource(objectName = "org.eclipse.virgo.kernel:type=BundleAdmin", description = "Virgo IDE Connector Bean")
public class StandardBundleAdmin implements BundleAdmin {

    private final PlatformAdmin platformAdmin;

    private final BundleContext bundleContext;

    private final ServiceTracker<CommandProcessor, CommandProcessor> commandProcessorTracker;

    public StandardBundleAdmin(PlatformAdmin platformAdmin,
            /* PackageAdmin packageAdmin, */BundleContext bundleContext) {
        this.platformAdmin = platformAdmin;
        this.bundleContext = bundleContext;
        this.commandProcessorTracker = new ServiceTracker<CommandProcessor, CommandProcessor>(bundleContext,
                CommandProcessor.class, null);
        this.commandProcessorTracker.open();
    }

    @ManagedOperation(description = "Stop the given bundle")
    public void stop(long bundleId) {
        execute("stop " + bundleId);
    }

    @ManagedOperation(description = "Start the given bundle")
    public void start(long bundleId) {
        execute("start " + bundleId);
    }

    @ManagedOperation(description = "Refresh the given bundle")
    public void refresh(long bundleId) {
        execute("refresh " + bundleId);
    }

    @ManagedOperation(description = "Refresh the given bundle")
    public void update(long bundleId) {
        execute("update " + bundleId);
    }

    @ManagedOperation(description = "Executes the given command")
    public String execute(String cmdLine) {
        @SuppressWarnings("deprecation")
        StringBufferInputStream in = new StringBufferInputStream("");
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        PrintStream out = new PrintStream(output);

        try {
            CommandProcessor commandProcessor = this.commandProcessorTracker.getService();
            if (commandProcessor != null) {
                CommandSession commandSession = commandProcessor.createSession(in, out, out);
                Object result = null;
                try {
                    result = commandSession.execute(cmdLine);
                } catch (Exception e) {
                    e.printStackTrace(out);
                    return output.toString();
                }
                if (result == null) {
                    result = "";
                }
                return output.toString() + "\n" + result.toString();
            }
            return "No CommandProcessor registered; cannot execute commands";
        } finally {
            try {
                out.close();
                output.close();
            } catch (IOException e) {
            }
        }
    }

    @ManagedOperation(description = "Returns the current OSGi Bundles")
    public Map<Long, Bundle> retrieveBundles() {
        Map<Long, Bundle> bundles = new HashMap<Long, Bundle>();
        for (org.osgi.framework.Bundle b : this.bundleContext.getBundles()) {

            Object version = b.getHeaders().get("Bundle-Version");
            Bundle bundle = new Bundle(Long.toString(b.getBundleId()), b.getSymbolicName(),
                    version != null ? version.toString() : "0", getState(b), b.getLocation());

            Dictionary<?, ?> headers = b.getHeaders();
            Enumeration<?> keys = headers.keys();
            while (keys.hasMoreElements()) {
                Object key = keys.nextElement();
                Object value = headers.get(key);
                bundle.addHeader(key.toString(), value.toString());
            }

            BundleDescription bundleDescription = this.platformAdmin.getState(false).getBundle(b.getBundleId());

            ExportPackageDescription[] exportedPackages = bundleDescription.getExportPackages();

            if (exportedPackages != null) {
                for (ExportPackageDescription exportedPackage : exportedPackages) {
                    PackageExport packageExport = new PackageExport(exportedPackage.getName(),
                            exportedPackage.getVersion() != null ? exportedPackage.getVersion().toString() : "0");
                    bundle.addPackageExport(packageExport);
                }
            }

            ExportPackageDescription[] visiblePackages = this.platformAdmin.getStateHelper()
                    .getVisiblePackages(bundleDescription);

            if (visiblePackages != null) {
                for (ExportPackageDescription visiblePackage : visiblePackages) {
                    PackageImport packageImport = new PackageImport(visiblePackage.getName(),
                            visiblePackage.getVersion() != null ? visiblePackage.getVersion().toString() : "0",
                            Long.toString(visiblePackage.getSupplier().getBundleId()));
                    bundle.addPackageImport(packageImport);
                }
            }

            if (b.getRegisteredServices() != null) {
                for (ServiceReference ref : b.getRegisteredServices()) {
                    org.eclipse.virgo.ide.management.remote.ServiceReference reference = new org.eclipse.virgo.ide.management.remote.ServiceReference(
                            Type.REGISTERED, ref.getBundle().getBundleId(),
                            OsgiServiceReferenceUtils.getServiceObjectClasses(ref));
                    Map<?, ?> props = OsgiServiceReferenceUtils.getServicePropertiesAsMap(ref);
                    for (Object key : props.keySet()) {
                        String value = props.get(key).toString();
                        if (props.get(key).getClass().isArray()) {
                            value = Arrays.deepToString((Object[]) props.get(key));
                        }
                        reference.addProperty(key.toString(), value);
                    }

                    if (ref.getUsingBundles() != null) {
                        for (org.osgi.framework.Bundle usingBundle : ref.getUsingBundles()) {
                            reference.addUsingBundle(usingBundle.getBundleId());
                        }
                    }
                    bundle.addRegisteredService(reference);
                }
            }

            if (b.getServicesInUse() != null) {
                for (ServiceReference ref : b.getServicesInUse()) {
                    org.eclipse.virgo.ide.management.remote.ServiceReference reference = new org.eclipse.virgo.ide.management.remote.ServiceReference(
                            Type.IN_USE, ref.getBundle().getBundleId(),
                            OsgiServiceReferenceUtils.getServiceObjectClasses(ref));
                    Map<?, ?> props = OsgiServiceReferenceUtils.getServicePropertiesAsMap(ref);
                    for (Object key : props.keySet()) {
                        String value = props.get(key).toString();
                        if (props.get(key).getClass().isArray()) {
                            value = Arrays.deepToString((Object[]) props.get(key));
                        }
                        reference.addProperty(key.toString(), value);
                    }

                    if (ref.getUsingBundles() != null) {
                        for (org.osgi.framework.Bundle usingBundle : ref.getUsingBundles()) {
                            reference.addUsingBundle(usingBundle.getBundleId());
                        }
                    }
                    bundle.addUsingService(reference);
                }
            }

            bundles.put(Long.valueOf(bundle.getId()), bundle);
        }
        return bundles;
    }

    private String getState(org.osgi.framework.Bundle b) {
        switch (b.getState()) {
        case org.osgi.framework.Bundle.ACTIVE:
            return "ACTIVE";
        case org.osgi.framework.Bundle.INSTALLED:
            return "INSTALLED";
        case org.osgi.framework.Bundle.RESOLVED:
            return "RESOLVED";
        case org.osgi.framework.Bundle.STARTING:
            return "STARTING";
        case org.osgi.framework.Bundle.STOPPING:
            return "";
        case org.osgi.framework.Bundle.UNINSTALLED:
            return "UNINSTALLED";
        default:
            return "UNKNOWN";
        }
    }

}