blob: dfe0844d7962e1c0b66843d89ba242aae4a27217 [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:
* Maximilian Koegel - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.util;
import org.eclipse.emf.emfstore.client.ESLocalProject;
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.connectionmanager.KeyStoreManager;
import org.eclipse.emf.emfstore.internal.client.model.impl.WorkspaceBase;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.exceptions.AccessControlException;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
/**
* Utility class for EMFStore clients to ease connecting to the server.
*
* @author koegel
*/
public final class EMFStoreClientUtil {
private static final String LOCALHOST_GENERATED_ENTRY_NAME = "EMFStore (generated entry)"; //$NON-NLS-1$
/**
* Private constructor for utility class.
*/
private EMFStoreClientUtil() {
// do nothing
}
/**
* Gives a server info for a given port and URL. Searches first for already existing ones. If the search fails, it
* creates a new one and registers it for later lookup.
*
* @param url the server URL (e.g. IP address or DNS name)
* @param port the server port
* @return a server info
*/
public static ServerInfo giveServerInfo(String url, int port) {
final ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
for (final ServerInfo existingServerInfo : workspace.toInternalAPI().getServerInfos()) {
if (existingServerInfo.getName().equals(LOCALHOST_GENERATED_ENTRY_NAME)) {
if (url.equals(existingServerInfo.getUrl()) && port == existingServerInfo.getPort()) {
return existingServerInfo;
}
}
}
final ServerInfo serverInfo = createServerInfo(url, port, null);
workspace.toInternalAPI().getServerInfos().add(serverInfo);
// TODO: OTS
((WorkspaceBase) workspace.toInternalAPI()).save();
return serverInfo;
}
/**
* Create a server info for a given port and URL.
*
* @param url the server URL (e.g. IP address or DNS name)
* @param port the server port
* @param certificateAlias the certificateAlias
* @return a server info
*/
public static ServerInfo createServerInfo(String url, int port, String certificateAlias) {
final ServerInfo serverInfo = ModelFactory.eINSTANCE.createServerInfo();
serverInfo.setName(LOCALHOST_GENERATED_ENTRY_NAME);
serverInfo.setUrl(url);
serverInfo.setPort(port);
if (certificateAlias == null) {
serverInfo.setCertificateAlias(KeyStoreManager.DEFAULT_CERTIFICATE);
} else {
serverInfo.setCertificateAlias(certificateAlias);
}
return serverInfo;
}
/**
* Create a default user session with the default super user and password and a server on localhost on the default
* port.
*
* @return a user session
*/
public static Usersession createUsersession() {
return createUsersession("super", "super", "localhost", 8080); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
/**
* Create a {@link Usersession} for the given credentials and server info.
*
* @param username the user name
* @param password the password
* @param serverUrl server URL
* @param serverPort server port
* @return a user session
*/
public static Usersession createUsersession(String username, String password, String serverUrl, int serverPort) {
final ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
for (final Usersession usersession : workspace.toInternalAPI().getUsersessions()) {
final ServerInfo existingServerInfo = usersession.getServerInfo();
if (existingServerInfo != null && existingServerInfo.getName().equals(LOCALHOST_GENERATED_ENTRY_NAME)
&& existingServerInfo.getUrl().equals(serverUrl) && existingServerInfo.getPort() == serverPort) {
final String encPassword = KeyStoreManager.getInstance().encrypt(password, existingServerInfo);
if (username.equals(usersession.getUsername()) && encPassword.equals(usersession.getPassword())) {
return usersession;
}
}
}
final Usersession usersession = ModelFactory.eINSTANCE.createUsersession();
usersession.setServerInfo(giveServerInfo(serverUrl, serverPort));
usersession.setUsername(username);
usersession.setPassword(password);
workspace.toInternalAPI().getUsersessions().add(usersession);
// TODO: OTS
((WorkspaceBase) workspace.toInternalAPI()).save();
return usersession;
}
/**
* Checks, if the given credentials can be authenticated at the given server.
*
* @param username the user name
* @param password the password
* @param serverUrl server url
* @param serverPort server port
* @param certificateAlias the certificateAlias
* @return true, if user name & password are right
* @throws ESException Problem with the EMFStore Server
*/
public static boolean dryLogin(String username, String password, String serverUrl, int serverPort,
String certificateAlias) throws ESException {
final Usersession usersession = ModelFactory.eINSTANCE.createUsersession();
usersession.setServerInfo(createServerInfo(serverUrl, serverPort, certificateAlias));
usersession.setUsername(username);
usersession.setPassword(password);
try {
usersession.logIn();
} catch (final AccessControlException e) {
return false;
}
return true;
}
/**
* Determine if the contents of two projects are equal.
*
* @param projectA a project
* @param projectB another project
* @return true if the projects´ contents are identical
*/
public static boolean areEqual(ESLocalProject projectA, ESLocalProject projectB) {
final ProjectSpace projectSpaceA = ((ESLocalProjectImpl) projectA).toInternalAPI();
final ProjectSpace projectSpaceB = ((ESLocalProjectImpl) projectB).toInternalAPI();
return ModelUtil.areEqual(projectSpaceA.getProject(), projectSpaceB.getProject());
}
}