/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdi.internal;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.jdi.internal.connect.SocketAttachingConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketLaunchingConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketListeningConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketRawLaunchingConnectorImpl;
import org.eclipse.jdt.debug.core.JDIDebugModel;

import com.sun.jdi.VirtualMachine;
import com.sun.jdi.VirtualMachineManager;
import com.sun.jdi.connect.AttachingConnector;
import com.sun.jdi.connect.Connector;
import com.sun.jdi.connect.LaunchingConnector;
import com.sun.jdi.connect.ListeningConnector;
import com.sun.jdi.connect.spi.Connection;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 */
public class VirtualMachineManagerImpl implements VirtualMachineManager {
	/** Major interface version. */
	public static int MAJOR_INTERFACE_VERSION = 1;
	/** Minor interface version. */
	public static int MINOR_INTERFACE_VERSION = 5;
	/**
	 * PrintWriter where verbose info is written to, null if no verbose must be
	 * given.
	 */
	private PrintWriter fVerbosePrintWriter = null;
	/** List of all VMs that are currently connected. */
	List<VirtualMachine> fConnectedVMs = new ArrayList<>();
	/** True if in verbose mode. */
	private boolean fVerbose = false;
	/** Name of verbose file. */
	private String fVerboseFile = null;

	/**
	 * Creates new VirtualMachineManagerImpl.
	 */
	public VirtualMachineManagerImpl() {

		getPreferences();

		// See if verbose info must be given.
		if (fVerbose) {
			OutputStream out;
			if (fVerboseFile != null && fVerboseFile.length() > 0) {
				try {
					out = new FileOutputStream(fVerboseFile);
				} catch (IOException e) {
					out = System.out;
					System.out
							.println(JDIMessages.VirtualMachineManagerImpl_Could_not_open_verbose_file___1
									+ fVerboseFile
									+ JDIMessages.VirtualMachineManagerImpl_____2
									+ e); //
				}
			} else {
				out = System.out;
			}
			fVerbosePrintWriter = new PrintWriter(out);
		}
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#majorInterfaceVersion()
	 */
	@Override
	public int majorInterfaceVersion() {
		return MAJOR_INTERFACE_VERSION;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#minorInterfaceVersion()
	 */
	@Override
	public int minorInterfaceVersion() {
		return MINOR_INTERFACE_VERSION;
	}

	/**
	 * Loads the user preferences from the jdi.ini file.
	 */
	private void getPreferences() {
		// Get jdi.ini info.
		URL url = getClass().getResource("/jdi.ini"); //$NON-NLS-1$
		if (url == null) {
			return;
		}

		try {
			InputStream stream = url.openStream();
			PropertyResourceBundle prefs = new PropertyResourceBundle(stream);

			try {
				fVerbose = Boolean
						.valueOf(prefs.getString("User.verbose")).booleanValue(); //$NON-NLS-1$
			} catch (MissingResourceException e) {
			}

			try {
				fVerboseFile = prefs.getString("Verbose.out"); //$NON-NLS-1$
			} catch (MissingResourceException e) {
			}

		} catch (IOException e) {
		}

	}

	/**
	 * @return Returns Timeout value for requests to VM, if not overridden for
	 *         the VM. This value is used to throw the exception
	 *         TimeoutException in JDI calls. NOTE: This is not in compliance
	 *         with the Sun's JDI.
	 */
	public int getGlobalRequestTimeout() {
		try {
			IPreferencesService srvc = Platform.getPreferencesService();
			if(srvc != null) {
				return Platform.getPreferencesService().getInt(
						JDIDebugModel.getPluginIdentifier(),
						JDIDebugModel.PREF_REQUEST_TIMEOUT,
						JDIDebugModel.DEF_REQUEST_TIMEOUT,
						null);
			}
		} catch (NoClassDefFoundError e) {
		}
		// return the hard coded preference if the JDI debug plug-in does not
		// exist
		return JDIDebugModel.DEF_REQUEST_TIMEOUT;
	}

	/**
	 * Adds a VM to the connected VM list.
	 */
	public void addConnectedVM(VirtualMachineImpl vm) {
		fConnectedVMs.add(vm);
	}

	/**
	 * Removes a VM from the connected VM list.
	 */
	public void removeConnectedVM(VirtualMachineImpl vm) {
		fConnectedVMs.remove(vm);
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#connectedVirtualMachines()
	 */
	@Override
	public List<VirtualMachine> connectedVirtualMachines() {
		return fConnectedVMs;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#allConnectors()
	 */
	@Override
	public List<Connector> allConnectors() {
		List<Connector> result = new ArrayList<>(attachingConnectors());
		result.addAll(launchingConnectors());
		result.addAll(listeningConnectors());
		return result;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#attachingConnectors()
	 */
	@Override
	public List<AttachingConnector> attachingConnectors() {
		ArrayList<AttachingConnector> list = new ArrayList<>(1);
		list.add(new SocketAttachingConnectorImpl(this));
		return list;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#launchingConnectors()
	 */
	@Override
	public List<LaunchingConnector> launchingConnectors() {
		ArrayList<LaunchingConnector> list = new ArrayList<>(2);
		list.add(new SocketLaunchingConnectorImpl(this));
		list.add(new SocketRawLaunchingConnectorImpl(this));
		return list;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#listeningConnectors()
	 */
	@Override
	public List<ListeningConnector> listeningConnectors() {
		ArrayList<ListeningConnector> list = new ArrayList<>(1);
		list.add(new SocketListeningConnectorImpl(this));
		return list;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#defaultConnector()
	 */
	@Override
	public LaunchingConnector defaultConnector() {
		return new SocketLaunchingConnectorImpl(this);
	}

	/**
	 * @return Returns PrintWriter to which verbose info must be written, or
	 *         null if no verbose must be given.
	 */
	public PrintWriter verbosePrintWriter() {
		return fVerbosePrintWriter;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#createVirtualMachine(com.sun.jdi.connect.spi.Connection)
	 */
	@Override
	public VirtualMachine createVirtualMachine(Connection connection) throws IOException {
		VirtualMachineImpl vmImpl = new VirtualMachineImpl(connection);
		return vmImpl;
	}

	/* (non-Javadoc)
	 * @see com.sun.jdi.VirtualMachineManager#createVirtualMachine(com.sun.jdi.connect.spi.Connection, java.lang.Process)
	 */
	@Override
	public VirtualMachine createVirtualMachine(Connection connection, Process process) throws IOException {
		VirtualMachineImpl vmImpl = new VirtualMachineImpl(connection);
		vmImpl.setLaunchedProcess(process);
		return vmImpl;
	}
}
