/******************************************************************************* * 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); } }