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