/*******************************************************************************
 * 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 = 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 : 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 = 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 = 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";
		}
	}

}
