/*
 * (c) Copyright IBM Corp. 2000, 2002.
 * All Rights Reserved.
 */
package org.eclipse.help.internal.protocols;
import java.io.*;
import org.eclipse.core.runtime.*;
import org.eclipse.help.ILiveHelpAction;
import org.eclipse.help.internal.util.Resources;
/**
 * URL that performs live help action.
 */
public class LiveHelpURL extends HelpURL {
	/**
	 * LiveHelpURL constructor.
	 * @param url java.lang.String
	 */
	public LiveHelpURL(String url) {
		super(url, "");
		int index = url.indexOf("?");
		if (index > -1) {
			if (url.length() > index + 1) {
				String query = url.substring(index + 1);
				this.query = new StringBuffer(query);
				parseQuery(query);
			}
			super.url = url.substring(0, index);
		}
	}
	/** Returns the path prefix that identifies the URL. */
	public static String getPrefix() {
		return "livhelp";
	}
	/**
	 * Opens a stream for reading.
	 * 
	 * @return java.io.InputStream
	 */
	public InputStream openStream() {
		if (arguments == null)
			return getErrorStream(Resources.getString("E030"));
		String pluginID = (String) arguments.get("pluginID");
		if (pluginID == null)
			return getErrorStream(Resources.getString("E030"));
		String className = (String) arguments.get("class");
		if (className == null)
			return getErrorStream(Resources.getString("E031"));
		String arg = (String) arguments.get("arg");
		Plugin plugin = Platform.getPlugin(pluginID);
		if (plugin == null)
			return getErrorStream(Resources.getString("E032"));
		ClassLoader loader = plugin.getDescriptor().getPluginClassLoader();
		try {
			Class c = loader.loadClass(className);
			Object o = c.newInstance();
			if (o instanceof ILiveHelpAction) {
				ILiveHelpAction helpExt = (ILiveHelpAction) o;
				if (arg != null)
					helpExt.setInitializationString(arg);
				Thread runnableLiveHelp = new Thread(helpExt);
				runnableLiveHelp.setDaemon(true);
				runnableLiveHelp.start();
			}
			return new ByteArrayInputStream("Done it".getBytes());
		} catch (ThreadDeath td) {
			throw td;
		} catch (Exception e) {
			return getErrorStream(e.toString());
		}
	}
	private InputStream getErrorStream(String msg) {
		String message = Resources.getString("E029", msg);
		try {
			return new ByteArrayInputStream(message.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException uee) {
			return new ByteArrayInputStream(message.getBytes());
		}
	}
}