/*******************************************************************************
 * Copyright (c) 2004, 2013 Richard Hoefter 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:
 *     Richard Hoefter (richard.hoefter@web.de) - initial API and implementation
 *     IBM Corporation - nlsing and incorporating into Eclipse
 *******************************************************************************/

package org.eclipse.ant.internal.ui.datatransfer;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;

/**
 * Helper class to access private method <code>org.eclipse.jdt.internal.launching.JavaAppletLaunchConfigurationDelegate}.buildHTMLFile()</code>.
 * 
 * <p>
 * Source was copied and slightly modified.
 */
public class AppletUtil {
	private AppletUtil() {
	}

	// create instance to access helper method
	private static AbstractJavaLaunchConfigurationDelegate fgDelegate = new AbstractJavaLaunchConfigurationDelegate() {
		@Override
		public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
			// do nothing
		}
	};

	/**
	 * Using the specified launch configuration, build an HTML file that specifies the applet to launch.
	 * 
	 * @return the created HTML file
	 */
	public static String buildHTMLFile(ILaunchConfiguration configuration) throws CoreException {
		String name = getMainTypeName(configuration);
		StringBuffer b = new StringBuffer();
		b.append("<!--" + BuildFileCreator.WARNING + " -->" + ExportUtil.NEWLINE); //$NON-NLS-1$ //$NON-NLS-2$
		b.append("<html>" + ExportUtil.NEWLINE); //$NON-NLS-1$
		b.append("    <body>" + ExportUtil.NEWLINE); //$NON-NLS-1$
		b.append("        <applet code="); //$NON-NLS-1$
		b.append(getQuotedString(name + ".class")); //$NON-NLS-1$
		String appletName = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_NAME, IAntCoreConstants.EMPTY_STRING);
		if (appletName.length() != 0) {
			b.append(" name=\"" + appletName + "\""); //$NON-NLS-1$ //$NON-NLS-2$
		}
		b.append(" width=\""); //$NON-NLS-1$
		b.append(Integer.toString(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_WIDTH, 200)));
		b.append("\" height=\""); //$NON-NLS-1$
		b.append(Integer.toString(configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_HEIGHT, 200)));
		b.append("\">" + ExportUtil.NEWLINE); //$NON-NLS-1$
		Map<String, String> parameters = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_APPLET_PARAMETERS, new HashMap<String, String>());
		if (parameters.size() != 0) {
			Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
			while (iterator.hasNext()) {
				Entry<String, String> next = iterator.next();
				b.append("            <param name="); //$NON-NLS-1$
				b.append(getQuotedString(next.getKey()));
				b.append(" value="); //$NON-NLS-1$
				b.append(getQuotedString(next.getValue()));
				b.append(">" + ExportUtil.NEWLINE); //$NON-NLS-1$
			}
		}
		b.append("        </applet>" + ExportUtil.NEWLINE); //$NON-NLS-1$
		b.append("    </body>" + ExportUtil.NEWLINE); //$NON-NLS-1$
		b.append("</html>" + ExportUtil.NEWLINE); //$NON-NLS-1$
		return b.toString();
	}

	private static String getQuotedString(String string) {
		if (string.indexOf('"') == -1) {
			return '"' + string + '"';
		}
		return '\'' + string + '\'';
	}

	/**
	 * Returns the main type name specified by the given launch configuration, or <code>null</code> if none.
	 * 
	 * @param configuration
	 *            launch configuration
	 * @return the main type name specified by the given launch configuration, or <code>null</code> if none
	 * @exception CoreException
	 *                if unable to retrieve the attribute
	 */
	public static String getMainTypeName(ILaunchConfiguration configuration) throws CoreException {
		return fgDelegate.getMainTypeName(configuration);
	}
}