/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 * wesendon
 * emueller
 ******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.connectionmanager;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.emfstore.client.sessionprovider.ESServerCall;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
import org.eclipse.emf.emfstore.internal.client.model.Usersession;
import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESServerCallImpl;
import org.eclipse.emf.emfstore.internal.common.api.APIDelegate;
import org.eclipse.emf.emfstore.internal.server.model.SessionId;
import org.eclipse.emf.emfstore.server.exceptions.ESException;

/**
 * This class is intended to wrap all server calls. It may be used either by sub-classing or using anonymous classes.
 * <br/>
 * The {@link SessionManager} ensures there's a valid session before executing the call.<br/>
 * For call of the {@link ConnectionManager}, always use {@link #getSessionId()}, since it is injected by the
 * {@link SessionManager}.<br/>
 * If initialized with an user session, it will be used for the server class when the SessionProvider isn't extended by
 * the user to change this behavior.<br/>
 * Using serverInfo as an input will call the login dialog in the default implementation.
 * Further, in the default implementation, when the {@link org.eclipse.emf.emfstore.internal.client.model.ProjectSpace}
 * is set,
 * it is checked whether it has an user session attached to it.
 *
 * @author wesendon
 * @author emueller
 *
 * @param <U> the return type of the wrapped action
 */
public abstract class ServerCall<U> implements APIDelegate<ESServerCall> {

	private ProjectSpace projectSpace;
	private Usersession usersession;
	private ServerInfo server;
	private SessionId sessionId;
	private IProgressMonitor monitor;
	private U ret;
	private ESServerCall apiImpl;

	/**
	 * Default constructor.
	 */
	public ServerCall() {
	}

	/**
	 * Default constructor with user session.
	 *
	 * @param usersession preselected user session
	 */
	public ServerCall(Usersession usersession) {
		this.usersession = usersession;
		setProgressMonitor(null);
	}

	/**
	 * Default constructor with project space.
	 *
	 * @param localProject
	 *            relevant project space if existent
	 */
	// TODO: OTS add javadoc to explain why type is a local project
	public ServerCall(ProjectSpace localProject) {
		this.projectSpace = localProject;
		setProgressMonitor(null);
	}

	/**
	 * Default constructor with serverinfo.
	 *
	 * @param server a given server
	 */
	public ServerCall(ServerInfo server) {
		this.server = server;
		setProgressMonitor(null);
	}

	/**
	 * Default constructor with user session and progress monitor.
	 *
	 * @param usersession
	 *            preselected user session
	 * @param monitor
	 *            monitor a progress monitor instance that is used during execution of the server call
	 */
	public ServerCall(Usersession usersession, IProgressMonitor monitor) {
		this.usersession = usersession;
		setProgressMonitor(monitor);
	}

	/**
	 * Default constructor with project space and progress monitor.
	 *
	 * @param localProject
	 *            relevant project, if existent
	 * @param monitor
	 *            monitor a progress monitor instance that is used during execution of the server call
	 */
	public ServerCall(ProjectSpace localProject, IProgressMonitor monitor) {
		this.projectSpace = localProject;
		setProgressMonitor(monitor);
	}

	/**
	 * Default constructor with server info and progress monitor.
	 *
	 * @param server
	 *            a given server info
	 * @param monitor
	 *            monitor a progress monitor instance that is used during execution of the server call
	 */
	public ServerCall(ServerInfo server, IProgressMonitor monitor) {
		this.server = server;
		setProgressMonitor(monitor);
	}

	/**
	 * Returns the server info that is used by this server call, if set.
	 *
	 * @return the server info that is used by this server call, if set
	 */
	public ServerInfo getServer() {
		return server;
	}

	/**
	 * Sets the server info that is used by this server call.
	 *
	 * @param server
	 *            the server info that should be used by this server call
	 * @return the server call itself
	 */
	public ServerCall<U> setServer(ServerInfo server) {
		this.server = server;
		return this;
	}

	/**
	 * Sets the user session to be used by this server call.
	 *
	 * @param usersession
	 *            the user session to be used by the server call
	 * @return the server call itself
	 */
	public ServerCall<U> setUsersession(Usersession usersession) {
		this.usersession = usersession;
		return this;
	}

	/**
	 * Returns the user session that is used by this server call.
	 *
	 * @return the user session in use
	 */
	public Usersession getUsersession() {
		return usersession;
	}

	/**
	 * Returns the project space that will be checked for a valid user session when
	 * executing this server call.
	 *
	 * @return the project space that will be checked for a valid user session
	 */
	public ProjectSpaceBase getProjectSpace() {
		return (ProjectSpaceBase) projectSpace;
	}

	/**
	 * Sets the progress monitor instance that may be used during
	 * execution of this server call.
	 *
	 * @param monitor
	 *            a progress monitor instance that may used during execution
	 *            of this server call
	 * @return the server call itself
	 */
	public ServerCall<U> setProgressMonitor(IProgressMonitor monitor) {
		if (monitor == null) {
			monitor = new NullProgressMonitor();
		}
		this.monitor = monitor;
		return this;
	}

	/**
	 * Returns the progress monitor instance that may be used during
	 * execution of this server call.
	 *
	 * @return the progress monitor instance that may be used during execution of this server call
	 */
	public IProgressMonitor getProgressMonitor() {
		return this.monitor;
	}

	/**
	 * Returns the connection manager used by this server call.
	 *
	 * @return the connection manager in use
	 */
	protected ConnectionManager getConnectionManager() {
		return ESWorkspaceProviderImpl.getInstance().getConnectionManager();
	}

	/**
	 * Returns the session ID to be used by this server call.
	 *
	 * @return the session ID to be used by the server call for authetication against the server
	 */
	protected SessionId getSessionId() {
		return sessionId;
	}

	/**
	 * Sets the session ID to be used by this server call.
	 *
	 * @param sessionId
	 *            the session ID to be used for authentication against the server
	 */
	public void setSessionId(SessionId sessionId) {
		this.sessionId = sessionId;
	}

	/**
	 * Runs this call with the given session ID.
	 *
	 * @param sessionId
	 *            the session ID to be used for authentication against the server
	 * @throws ESException
	 *             in case any exception occurs during execution of the call
	 */
	public void run(SessionId sessionId) throws ESException {
		setSessionId(sessionId);
		ret = run();
	}

	/**
	 * Performs the actual behavior of the call. Meant to be implemented by clients.
	 *
	 * @return a return value of type <code>U</code>
	 * @throws ESException
	 *             in case any exception occurs during execution of the call
	 */
	protected abstract U run() throws ESException;

	/**
	 * Executes the server call.
	 *
	 * @return a return value of type <code>U</code>
	 * @throws ESException
	 *             in case any exception occurs during execution of the call
	 */
	public U execute() throws ESException {
		ESWorkspaceProviderImpl.getInstance().getSessionManager().execute(this);
		return ret;
	}

	/**
	 *
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.emf.emfstore.internal.common.api.APIDelegate#toAPI()
	 */
	public ESServerCall toAPI() {
		if (apiImpl == null) {
			apiImpl = createAPI();
		}
		return apiImpl;
	}

	/**
	 *
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.emf.emfstore.internal.common.api.APIDelegate#createAPI()
	 */
	public ESServerCall createAPI() {
		return new ESServerCallImpl<U>(this);
	}

}
