/*******************************************************************************
 * Copyright (c) 2007 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.wst.server.ui.internal.wizard.fragment;

import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.wst.server.core.IModuleArtifact;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.TaskModel;
import org.eclipse.wst.server.core.internal.IClient;
import org.eclipse.wst.server.ui.internal.EclipseUtil;
import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
import org.eclipse.wst.server.ui.internal.wizard.WizardTaskUtil;
import org.eclipse.wst.server.ui.wizard.WizardFragment;
/**
 * A fragment used to select a client.
 */
public class OptionalClientWizardFragment extends WizardFragment {
	protected IClient[] clients;

	protected IModuleArtifact moduleArtifact;
	protected IServer lastServer;
	protected Object lastLaunchable;

	public OptionalClientWizardFragment(IModuleArtifact moduleArtifact) {
		super();
		this.moduleArtifact = moduleArtifact;
	}

	protected void createChildFragments(List<WizardFragment> list) {
		if (clients != null && clients.length > 1)
			list.add(new SelectClientWizardFragment());
	}

	protected void updateClients() {
		if (getTaskModel() == null)
			return;
		
		try {
			IServer server = (IServer) getTaskModel().getObject(TaskModel.TASK_SERVER);
			if (lastServer == null && server == null)
				return;
			
			// get the launchable adapter and module object
			Object launchable = null;
			try {
				Object[] obj = ServerUIPlugin.getLaunchableAdapter(server, moduleArtifact);
				getTaskModel().putObject(WizardTaskUtil.TASK_LAUNCHABLE_ADAPTER, obj[0]);
				getTaskModel().putObject(WizardTaskUtil.TASK_LAUNCHABLE, obj[1]);
				launchable = obj[1];
			} catch (CoreException ce) {
				getTaskModel().putObject(WizardTaskUtil.TASK_LAUNCHABLE_ADAPTER, null);
				getTaskModel().putObject(WizardTaskUtil.TASK_LAUNCHABLE, null);
				EclipseUtil.openError(null, ce.getStatus());
				return;
			}
			
			// stop here if the server and launchable haven't changed
			if (lastServer != null && lastServer.equals(server)) {
				if (lastLaunchable == null && launchable == null)
					return;
				if (lastLaunchable != null && lastLaunchable.equals(launchable)) {
					return;
				}
			}
			lastServer = server;
			lastLaunchable = launchable;
			
			String launchMode = (String) getTaskModel().getObject(TaskModel.TASK_LAUNCH_MODE);
			clients = ServerUIPlugin.getClients(server, launchable, launchMode);
			
			getTaskModel().putObject(WizardTaskUtil.TASK_CLIENTS, null);
			getTaskModel().putObject(WizardTaskUtil.TASK_HAS_CLIENTS, new Boolean(false));
			if (clients != null) {
				if (clients.length > 1) {
					getTaskModel().putObject(WizardTaskUtil.TASK_CLIENTS, clients);
					getTaskModel().putObject(WizardTaskUtil.TASK_HAS_CLIENTS, new Boolean(true));
				} else
					getTaskModel().putObject(WizardTaskUtil.TASK_CLIENT, clients[0]);
			}
			
			updateChildFragments();
		} catch (Exception e) {
			// ignore
		}
	}

	public void enter() {
		updateClients();
	}

	public List getChildFragments() {
		updateClients();
		return super.getChildFragments();
	}

	public void setTaskModel(TaskModel taskModel) {
		super.setTaskModel(taskModel);
		updateClients();
	}
}