/*******************************************************************************
 * 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.jdt.internal.debug.ui.snippeteditor;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import java.security.CodeSource;
import java.security.ProtectionDomain;

/**
 * Support class for launching a snippet evaluation.
 * <p>
 * CAUTION: This class gets compiled with target=jsr14, see scripts/buildExtraJAR.xml. Don't use URLClassLoader#close() or other post-1.4 APIs!
 */
public class ScrapbookMain {

	public static void main(String[] args) {

		URL[] urls= getClasspath(args);
		if (urls == null) {
			return;
		}

		while (true) {
			try {
				evalLoop(urls);
			} catch (ClassNotFoundException e) {
				return;
			} catch (NoSuchMethodException e) {
				return;
			} catch (InvocationTargetException e) {
				return;
			} catch (IllegalAccessException e) {
				return;
			}
		}

	}

	static void evalLoop(URL[] urls) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
		@SuppressWarnings("resource")
		ClassLoader cl= new URLClassLoader(urls, null);
		Class<?> clazz= cl.loadClass("org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain1"); //$NON-NLS-1$
		Method method= clazz.getDeclaredMethod("eval", new Class[] {Class.class}); //$NON-NLS-1$
		method.invoke(null, new Object[] {ScrapbookMain.class});
	}

	/**
	 * The magic "no-op" method, where {@link org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookLauncher#createMagicBreakpoint(String)} sets a
	 * breakpoint.
	 * <p>
	 */
	public static void nop() {
		try {
			Thread.sleep(100);
		} catch(InterruptedException e) {
		}
	}


	static URL[] getClasspath(String[] urlStrings) {

		//The URL Strings MUST be properly encoded
		//using URLEncoder...see ScrapbookLauncher for details
		URL[] urls= new URL[urlStrings.length + 1];

		for (int i = 0; i < urlStrings.length; i++) {
			try {
				urls[i + 1] = new URL(URLDecoder.decode(urlStrings[i]));
			} catch (MalformedURLException e) {
				return null;
			}
		}

		ProtectionDomain pd = ScrapbookMain.class.getProtectionDomain();
		if (pd == null) {
			return null;
		}
		CodeSource cs = pd.getCodeSource();
		if (cs == null) {
			return null;
		}
		urls[0] = cs.getLocation();

		return urls;
	}
}
