blob: 9b0c8819546286e683f296edca5c2c25e788f186 [file] [log] [blame]
/*******************************************************************************
* 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:
* ovonwesen
* emueller
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.controller;
import java.text.MessageFormat;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
import org.eclipse.emf.emfstore.client.observer.ESShareObserver;
import org.eclipse.emf.emfstore.internal.client.common.UnknownEMFStoreWorkloadCommand;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.Usersession;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.internal.client.model.impl.AdminBrokerImpl;
import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.ProjectId;
import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.roles.RolesPackage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.LogMessage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.VersioningFactory;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
/**
* Shares a project.
*
* @author ovonwesen
* @author emueller
*/
public class ShareController extends ServerCall<ProjectInfo> {
/**
* Constructor.
*
* @param projectSpace
* the project space to be shared
* @param session
* the session to use during share
* @param monitor
* a progress monitor that is used to indicate the progress of the share
*/
public ShareController(ProjectSpaceBase projectSpace, Usersession session, IProgressMonitor monitor) {
super(projectSpace);
// if session is null, session will be injected by sessionmanager
setUsersession(session);
setProgressMonitor(monitor);
}
@Override
@SuppressWarnings("unchecked")
protected ProjectInfo run() throws ESException {
getProgressMonitor().beginTask(Messages.ShareController_Sharing_Project, 100);
getProgressMonitor().worked(1);
getProgressMonitor().subTask(Messages.ShareController_Preparing_Share);
final LogMessage logMessage = VersioningFactory.eINSTANCE.createLogMessage();
logMessage.setAuthor(getUsersession().getUsername());
logMessage.setClientDate(new Date());
logMessage.setMessage(Messages.ShareController_Initial_Commit);
ProjectInfo projectInfo = null;
getProjectSpace().stopChangeRecording();
getProgressMonitor().worked(10);
if (getProgressMonitor().isCanceled()) {
getProjectSpace().save();
getProjectSpace().startChangeRecording();
getProgressMonitor().done();
}
getProgressMonitor().subTask(Messages.ShareController_Sharing_Project_With_Server);
// make sure, current state of caches is written to resource
getProjectSpace().save();
projectInfo = createProject(logMessage);
addParticipant(projectInfo.getProjectId());
getProgressMonitor().worked(30);
getProgressMonitor().subTask("Finalizing share"); //$NON-NLS-1$
// set attributes after server call
getProgressMonitor().subTask(Messages.ShareController_Settings_Attributes);
setUsersession(getUsersession());
ESWorkspaceProviderImpl.getObserverBus().register(getProjectSpace(), ESLoginObserver.class);
getProjectSpace().save();
getProjectSpace().startChangeRecording();
getProjectSpace().setBaseVersion(ModelUtil.clone(projectInfo.getVersion()));
getProjectSpace().setLastUpdated(new Date());
getProjectSpace().setProjectId(ModelUtil.clone(projectInfo.getProjectId()));
getProjectSpace().setUsersession(getUsersession());
getProjectSpace().saveProjectSpaceOnly();
// TODO ASYNC implement File Upload with observer
// If any files have already been added, upload them.
getProgressMonitor().worked(20);
getProgressMonitor().subTask(Messages.ShareController_Uploading_Files);
getProjectSpace().getFileTransferManager().uploadQueuedFiles(getProgressMonitor());
getProgressMonitor().worked(20);
getProgressMonitor().subTask(Messages.ShareController_Finalizing_Share);
getProjectSpace().getLocalChangePackage().clear();
getProjectSpace().save();
getProjectSpace().updateDirtyState();
getProgressMonitor().done();
ESWorkspaceProviderImpl.getObserverBus().notify(ESShareObserver.class)
.shareDone(getProjectSpace().toAPI());
return projectInfo;
}
private ProjectInfo createProject(final LogMessage logMessage) throws ESException {
return new UnknownEMFStoreWorkloadCommand<ProjectInfo>(getProgressMonitor()) {
@Override
public ProjectInfo run(IProgressMonitor monitor) throws ESException {
return ESWorkspaceProviderImpl
.getInstance()
.getConnectionManager()
.createProject(
getUsersession().getSessionId(),
getProjectSpace().getProjectName() == null ? MessageFormat.format(
Messages.ShareController_Project_At, new Date())
: getProjectSpace().getProjectName(),
StringUtils.EMPTY,
logMessage,
getProjectSpace().getProject());
}
}.execute();
}
private void addParticipant(final ProjectId projectId) throws ESException {
new UnknownEMFStoreWorkloadCommand<Void>(getProgressMonitor()) {
@Override
public Void run(IProgressMonitor monitor) throws ESException {
new AdminBrokerImpl(getUsersession().getServerInfo(), getSessionId()).addInitialParticipant(
projectId,
getUsersession().getACUser().getId(),
RolesPackage.eINSTANCE.getProjectAdminRole());
return null;
}
}.execute();
}
}