/*******************************************************************************
 * Copyright (c) 2011, 2017 SAP AG and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Lazar Kirchev, SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.equinox.console.ssh;

import org.apache.felix.service.command.CommandProcessor;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;

public class Activator implements BundleActivator {
	
	private static BundleContext context;
	private static SshCommand sshConnection = null;
	private static boolean isFirstProcessor = true;
	
	private ServiceTracker<CommandProcessor, SshCommand> commandProcessorTracker;
	
	public static class ProcessorCustomizer implements ServiceTrackerCustomizer<CommandProcessor, SshCommand> {

		private final BundleContext context;

		public ProcessorCustomizer(BundleContext context) {
			this.context = context;
		}

		@Override
		public SshCommand addingService(ServiceReference<CommandProcessor> reference) {
			CommandProcessor processor = context.getService(reference);
			if (processor == null)
				return null;

			if (isFirstProcessor) {
				isFirstProcessor = false;
				sshConnection = new SshCommand(processor, context);
				sshConnection.startService();
			} else {
				sshConnection.addCommandProcessor(processor);
			}

			return sshConnection;
		}

		@Override
		public void modifiedService(
				ServiceReference<CommandProcessor> reference,
				SshCommand service) {
			// nothing
		}

		@Override
		public void removedService(ServiceReference<CommandProcessor> reference, SshCommand service) {
			CommandProcessor processor = context.getService(reference);
			service.removeCommandProcessor(processor);
		}	
	}

	static BundleContext getContext() {
		return context;
	}

	@Override
	public void start(BundleContext bundleContext) throws Exception {
		context = bundleContext;
		commandProcessorTracker = new ServiceTracker<>(context, CommandProcessor.class, new ProcessorCustomizer(context));
		commandProcessorTracker.open();
	}

	@Override
	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;
		commandProcessorTracker.close();
		
		try {
			sshConnection.ssh(new String[]{"stop"});
		} catch (Exception e) {
			// expected if the ssh server is not started
		}
	}

}
