blob: ead1b554298b79e279e21fa28581b1d5b8532b5b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012-2013 EclipseSource Muenchen GmbH 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:
* Otto von Wesendonk, Maximilian Koegel, Edgar Mueller - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.impl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.io.FilenameUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.emfstore.internal.client.importexport.impl.ExportImportDataUnits;
import org.eclipse.emf.emfstore.internal.client.importexport.impl.ExportProjectSpaceController;
import org.eclipse.emf.emfstore.internal.client.importexport.impl.ExportWorkspaceController;
import org.eclipse.emf.emfstore.internal.client.model.AdminBroker;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.ModelFactory;
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.Workspace;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.ProjectUrlResolutionException;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.ServerUrlResolutionException;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.UnkownProjectException;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
import org.eclipse.emf.emfstore.internal.client.model.util.ResourceHelper;
import org.eclipse.emf.emfstore.internal.client.observers.DeleteProjectSpaceObserver;
import org.eclipse.emf.emfstore.internal.common.ESDisposable;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.exceptions.AccessControlException;
import org.eclipse.emf.emfstore.internal.server.model.url.ProjectUrlFragment;
import org.eclipse.emf.emfstore.internal.server.model.url.ServerUrl;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
/**
* Workspace space base class that contains custom user methods.
*
* @author koegel
* @author wesendon
* @author emueller
*
*/
public abstract class WorkspaceBase extends EObjectImpl implements Workspace, ESDisposable,
DeleteProjectSpaceObserver {
private ESWorkspaceImpl apiImplClass;
/**
* A mapping between project and project spaces.
*
* @generated NOT
*/
private Map<Project, ProjectSpace> projectToProjectSpaceMap;
/**
* The resource set of the workspace.
*
* @generated NOT
*/
private ResourceSet workspaceResourceSet;
// BEGIN OF CUSTOM CODE
/**
* Adds a new ProjectSpace to the workspace.
*
* @param projectSpace
* The project space to be added
*/
public void addProjectSpace(ProjectSpace projectSpace) {
getProjectSpaces().add(projectSpace);
projectToProjectSpaceMap.put(projectSpace.getProject(), projectSpace);
}
/**
* Clone a project.
*
* @param projectName The name of the new project.
* @param originalProject The project to clone.
* @return The new {@link ProjectSpace} of the cloned {@link Project}.
*/
public ProjectSpace cloneProject(String projectName, Project originalProject) {
final ProjectSpace projectSpace = ModelFactory.eINSTANCE.createProjectSpace();
projectSpace.setProject(ModelUtil.clone(originalProject));
projectSpace.setProjectName(projectName);
projectSpace.initResources(getResourceSet());
addProjectSpace(projectSpace);
save();
return projectSpace;
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.client.ESWorkspace#createLocalProject(java.lang.String)
*/
public ProjectSpace createLocalProject(String projectName) {
return cloneProject(projectName,
org.eclipse.emf.emfstore.internal.common.model.ModelFactory.eINSTANCE.createProject());
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#removeProjectToProjectSpaceEntry(org.eclipse.emf.emfstore.internal.client.model.ProjectSpace)
*/
public void removeProjectToProjectSpaceEntry(ProjectSpace projectSpace) {
projectToProjectSpaceMap.remove(projectSpace.getProject());
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#addProjectToProjectSpaceEntry(org.eclipse.emf.emfstore.internal.client.model.ProjectSpace)
*/
public void addProjectToProjectSpaceEntry(ProjectSpace projectSpace) {
projectToProjectSpaceMap.put(projectSpace.getProject(), projectSpace);
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#init()
*/
@SuppressWarnings("unchecked")
public void init() {
projectToProjectSpaceMap = new LinkedHashMap<Project, ProjectSpace>();
// initialize all projectSpaces
for (final ProjectSpace projectSpace : getProjectSpaces()) {
projectSpace.init();
projectToProjectSpaceMap.put(projectSpace.getProject(), projectSpace);
}
ESWorkspaceProviderImpl.getObserverBus().register(this, DeleteProjectSpaceObserver.class);
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.common.ESDisposable#dispose()
*/
public void dispose() {
for (final ProjectSpace projectSpace : getProjectSpaces()) {
((ProjectSpaceBase) projectSpace).dispose();
}
getServerInfos().clear();
getUsersessions().clear();
save();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#setResourceSet(org.eclipse.emf.ecore.resource.ResourceSet)
*/
public void setResourceSet(ResourceSet resourceSet) {
workspaceResourceSet = resourceSet;
for (final ProjectSpace projectSpace : getProjectSpaces()) {
final ProjectSpaceBase base = (ProjectSpaceBase) projectSpace;
base.setResourceSet(workspaceResourceSet);
}
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#updateACUser(org.eclipse.emf.emfstore.internal.client.model.ServerInfo)
*/
public void updateACUser(ServerInfo serverInfo) throws ESException {
new ServerCall<Void>(serverInfo) {
@Override
protected Void run() throws ESException {
getUsersession().setACUser(getConnectionManager().resolveUser(getSessionId(), null));
return null;
}
}.execute();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#updateACUser(org.eclipse.emf.emfstore.internal.client.model.Usersession)
*/
public void updateACUser(Usersession usersession) throws ESException {
new ServerCall<Void>(usersession) {
@Override
protected Void run() throws ESException {
getUsersession().setACUser(getConnectionManager().resolveUser(getSessionId(), null));
return null;
}
}.execute();
}
// BEGIN OF CUSTOM CODE
/**
* {@inheritDoc}
*/
public ResourceSet getResourceSet() {
return workspaceResourceSet;
}
/**
* {@inheritDoc}
*/
public ProjectSpace importProject(Project project, String name, String description) {
final ProjectSpace projectSpace = ModelFactory.eINSTANCE.createProjectSpace();
projectSpace.setProject(project);
projectSpace.setProjectName(name);
projectSpace.setProjectDescription(description);
projectSpace.initResources(workspaceResourceSet);
addProjectSpace(projectSpace);
save();
return projectSpace;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#importProject(java.lang.String)
*/
public ProjectSpace importProject(String absoluteFileName) throws IOException {
final Project project = ResourceHelper.getElementFromResource(absoluteFileName, Project.class, 0);
return importProject(project, absoluteFileName.substring(absoluteFileName.lastIndexOf(File.separatorChar) + 1),
"Imported from " + absoluteFileName);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#importProjectSpace(java.lang.String)
*/
public ProjectSpace importProjectSpace(String absoluteFileName) throws IOException {
final ProjectSpace projectSpace = ResourceHelper
.getElementFromResource(absoluteFileName, ProjectSpace.class, 0);
final String parent = FilenameUtils.getFullPath(absoluteFileName);
final File parentFolder = new File(parent);
final File[] projects = parentFolder.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(ExportImportDataUnits.Project.getExtension());
}
});
if (projects.length == 0) {
throw new FileNotFoundException("Project was not found.");
}
if (projects.length > 1) {
throw new FileNotFoundException("Cannot find project because multiple files were found.");
}
final Project project = ResourceHelper.getElementFromResource(projects[0].getAbsolutePath(), Project.class, 0);
projectSpace.setProject(project);
projectSpace.setIdentifier(ModelFactory.eINSTANCE.createProjectSpace().getIdentifier());
projectSpace.initResources(workspaceResourceSet);
addProjectSpace(projectSpace);
save();
return projectSpace;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#resolve(org.eclipse.emf.emfstore.internal.server.model.url.ProjectUrlFragment)
*/
public Set<ProjectSpace> resolve(ProjectUrlFragment projectUrlFragment) throws ProjectUrlResolutionException {
final Set<ProjectSpace> result = new LinkedHashSet<ProjectSpace>();
for (final ProjectSpace projectSpace : getProjectSpaces()) {
if (projectSpace.getProjectId().equals(projectUrlFragment.getProjectId())) {
result.add(projectSpace);
}
}
if (result.size() == 0) {
throw new ProjectUrlResolutionException();
}
return result;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#resolve(org.eclipse.emf.emfstore.internal.server.model.url.ServerUrl)
*/
public Set<ServerInfo> resolve(ServerUrl serverUrl) throws ServerUrlResolutionException {
final Set<ServerInfo> result = new LinkedHashSet<ServerInfo>();
for (final ServerInfo serverInfo : getServerInfos()) {
final boolean matchingHostname = serverInfo.getUrl().equals(serverUrl.getHostName());
final boolean matchingPort = serverInfo.getPort() == serverUrl.getPort();
if (matchingHostname && matchingPort) {
result.add(serverInfo);
}
}
if (result.size() == 0) {
throw new ServerUrlResolutionException();
}
return result;
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#save()
*/
public void save() {
try {
ModelUtil.saveResource(eResource(), ModelUtil.getResourceLogger());
} catch (final IOException e) {
// MK Auto-generated catch block
// FIXME OW MK: also insert code for dangling href handling here
}
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#exportProjectSpace(org.eclipse.emf.emfstore.internal.client.model.ProjectSpace,
* java.io.File)
*/
public void exportProjectSpace(ProjectSpace projectSpace, File file) throws IOException {
new ExportProjectSpaceController(projectSpace).execute(file, new NullProgressMonitor());
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#exportProjectSpace(org.eclipse.emf.emfstore.internal.client.model.ProjectSpace,
* java.io.File, org.eclipse.core.runtime.IProgressMonitor)
*/
public void exportProjectSpace(ProjectSpace projectSpace, File file, IProgressMonitor progressMonitor)
throws IOException {
new ExportProjectSpaceController(projectSpace).execute(file, progressMonitor);
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#exportWorkSpace(java.io.File)
*/
public void exportWorkSpace(File file) throws IOException {
new ExportWorkspaceController().execute(file, new NullProgressMonitor());
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#exportWorkSpace(java.io.File,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public void exportWorkSpace(File file, IProgressMonitor progressMonitor) throws IOException {
new ExportWorkspaceController().execute(file, progressMonitor);
}
/**
* {@inheritDoc}<br/>
* <br/>
* This is to enable the workspace to be root of table views.
*
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
* @generated NOT
*/
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
return null;
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#getAdminBroker(org.eclipse.emf.emfstore.internal.client.model.ServerInfo)
*/
public AdminBroker getAdminBroker(final ServerInfo serverInfo) throws ESException, AccessControlException {
return new ServerCall<AdminBroker>(serverInfo) {
@Override
protected AdminBroker run() throws ESException {
return new AdminBrokerImpl(serverInfo, getSessionId());
}
}.execute();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#getAdminBroker(org.eclipse.emf.emfstore.internal.client.model.Usersession)
*/
public AdminBroker getAdminBroker(final Usersession usersession) throws ESException, AccessControlException {
return new ServerCall<AdminBroker>(usersession) {
@Override
protected AdminBroker run() throws ESException {
return new AdminBrokerImpl(usersession.getServerInfo(), getSessionId());
}
}.execute();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#getEditingDomain()
*/
public EditingDomain getEditingDomain() {
return ESWorkspaceProviderImpl.getInstance().getEditingDomain();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#getProjectSpace(org.eclipse.emf.emfstore.internal.common.model.Project)
*/
public ProjectSpace getProjectSpace(Project project) throws UnkownProjectException {
final ProjectSpace projectSpace = projectToProjectSpaceMap.get(project);
if (projectSpace == null) {
throw new UnkownProjectException();
}
return projectSpace;
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.observers.DeleteProjectSpaceObserver#projectSpaceDeleted(org.eclipse.emf.emfstore.internal.client.model.ProjectSpace)
*/
public void projectSpaceDeleted(ProjectSpace projectSpace) {
assert projectSpace != null;
getProjectSpaces().remove(projectSpace);
save();
projectToProjectSpaceMap.remove(projectSpace.getProject());
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#addServerInfo(org.eclipse.emf.emfstore.internal.client.model.ServerInfo)
*/
public void addServerInfo(ServerInfo serverInfo) {
getServerInfos().add(serverInfo);
save();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.client.model.Workspace#removeServerInfo(org.eclipse.emf.emfstore.internal.client.model.ServerInfo)
*/
public void removeServerInfo(ServerInfo serverInfo) {
getServerInfos().remove(serverInfo);
final List<Usersession> deletables = new ArrayList<Usersession>();
for (final Usersession session : getUsersessions()) {
if (session.getServerInfo() == serverInfo) {
try {
session.logout();
} catch (final ESException e) {
// ignore, will be deleted anyways
}
deletables.add(session);
}
}
getUsersessions().removeAll(deletables);
save();
}
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.internal.common.api.APIDelegate#toAPI()
*/
public ESWorkspaceImpl toAPI() {
if (apiImplClass == null) {
apiImplClass = createAPI();
}
return apiImplClass;
}
/**
* Set the API implementation class.
*
* @param apiImpl
* the internal workspace implementation class to be used
*/
public void setAPIImpl(ESWorkspaceImpl apiImpl) {
apiImplClass = apiImpl;
}
public ESWorkspaceImpl createAPI() {
return new ESWorkspaceImpl(this);
}
}