blob: 686d75ffeefe0a3dc0ce12e23ea6f9270b68ed58 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 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:
* Edgar Mueller - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.client.test.common.util;
// import java.io.File;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.emfstore.client.ESServer;
import org.eclipse.emf.emfstore.client.ESUsersession;
import org.eclipse.emf.emfstore.client.exceptions.ESServerStartFailedException;
import org.eclipse.emf.emfstore.client.test.common.mocks.AdminConnectionManagerMock;
import org.eclipse.emf.emfstore.client.test.common.mocks.ConnectionMock;
import org.eclipse.emf.emfstore.client.test.common.mocks.DAOFacadeMock;
import org.eclipse.emf.emfstore.client.test.common.mocks.MockServerSpace;
import org.eclipse.emf.emfstore.client.test.common.mocks.ResourceFactoryMock;
import org.eclipse.emf.emfstore.client.test.common.mocks.ServerMock;
import org.eclipse.emf.emfstore.common.extensionpoint.ESExtensionElement;
import org.eclipse.emf.emfstore.common.extensionpoint.ESExtensionPoint;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
import org.eclipse.emf.emfstore.internal.client.model.impl.AdminBrokerImpl;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESUsersessionImpl;
import org.eclipse.emf.emfstore.internal.common.CommonUtil;
import org.eclipse.emf.emfstore.internal.common.model.util.FileUtil;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.EMFStore;
import org.eclipse.emf.emfstore.internal.server.ServerConfiguration;
import org.eclipse.emf.emfstore.internal.server.accesscontrol.AccessControl;
import org.eclipse.emf.emfstore.internal.server.core.EMFStoreImpl;
import org.eclipse.emf.emfstore.internal.server.exceptions.ConnectionException;
import org.eclipse.emf.emfstore.internal.server.exceptions.FatalESException;
import org.eclipse.emf.emfstore.internal.server.model.ModelFactory;
import org.eclipse.emf.emfstore.internal.server.model.ProjectId;
import org.eclipse.emf.emfstore.internal.server.model.ServerSpace;
import org.eclipse.emf.emfstore.internal.server.model.SessionId;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACGroup;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnit;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnitId;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACUser;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.AccesscontrolFactory;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.roles.RolesFactory;
import org.eclipse.emf.emfstore.internal.server.model.dao.ACDAOFacade;
import org.eclipse.emf.emfstore.internal.server.model.impl.api.ESSessionIdImpl;
import org.eclipse.emf.emfstore.server.auth.ESAuthenticationControlType;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.osgi.framework.FrameworkUtil;
/**
*
* @author emueller
*
*/
public final class ServerUtil {
private static final String ES_PROPERTIES_FILE = "es.properties"; //$NON-NLS-1$
private ServerUtil() {
}
private static final String SUPER = "super"; //$NON-NLS-1$
/**
* Returns the default port of EMFStore which is 8888.
*
* @return the default port of EMFStore
*/
public static int defaultPort() {
return 8080;
}
/**
* Returns the default port of EMFStore which is 8888.
*
* @return the default port of EMFStore
*/
public static String localhost() {
return "localhost"; //$NON-NLS-1$
}
public static String superUserPassword() {
return SUPER;
}
public static String superUser() {
return SUPER;
}
public static ESServer startServer() throws ESServerStartFailedException {
// AuthControlMock authMock = new AuthControlMock();
initServerSpace();
// perform initial default setup
CommonUtil.setTesting(true);
// copy es.properties file to workspace if not existent
copyFileToWorkspace(ServerConfiguration.getConfFile(),
ES_PROPERTIES_FILE,
Messages.ServerUtil_Could_Not_Copy_Properties_File_To_Config_Folder,
Messages.ServerUtil_Default_Properties_File_Copied_To_Config_Folder);
// copy keystore file to workspace if not existent
copyFileToWorkspace(ServerConfiguration.getServerKeyStorePath(),
ServerConfiguration.SERVER_KEYSTORE_FILE,
Messages.ServerUtil_Failed_To_Copy_Keystore,
Messages.ServerUtil_Keystore_Copied_To_Server_Workspace);
return ESServer.FACTORY.createAndStartLocalServer();
}
public static void stopServer() {
ESServer.FACTORY.stopLocalServer();
}
public static ServerMock startMockServer() throws IllegalArgumentException, ESServerStartFailedException,
FatalESException {
return startMockServer(Collections.<String, String> emptyMap());
}
public static ServerMock startMockServer(Map<String, String> properties) throws ESServerStartFailedException,
IllegalArgumentException,
FatalESException {
// AuthControlMock authMock = new AuthControlMock();
final DAOFacadeMock daoFacadeMock = new DAOFacadeMock();
final ServerSpace serverSpace = initServerSpace(daoFacadeMock);
// perform initial default setup
CommonUtil.setTesting(true);
// copy es.properties file to workspace if not existent
copyFileToWorkspace(ServerConfiguration.getConfFile(), ES_PROPERTIES_FILE,
Messages.ServerUtil_Could_Not_Copy_Properties_File_To_Config_Folder,
Messages.ServerUtil_Default_Properties_File_Copied_To_Config_Folder);
// copy keystore file to workspace if not existent
copyFileToWorkspace(ServerConfiguration.getServerKeyStorePath(), ServerConfiguration.SERVER_KEYSTORE_FILE,
Messages.ServerUtil_Failed_To_Copy_Keystore, Messages.ServerUtil_Keystore_Copied_To_Server_Workspace);
ServerConfiguration.setProperties(initProperties(properties));
setSuperUser(daoFacadeMock);
final AccessControl accessControl = new AccessControl(
ESAuthenticationControlType.model,
serverSpace);
final EMFStore emfStore = EMFStoreImpl.createInterface(serverSpace, accessControl);
ESWorkspaceProviderImpl.getInstance().setConnectionManager(
new ConnectionMock(emfStore, accessControl));
ESWorkspaceProviderImpl.getInstance().setAdminConnectionManager(
new AdminConnectionManagerMock(daoFacadeMock, accessControl, serverSpace));
final ESServer createServer = ESServer.FACTORY.createServer("localhost", //$NON-NLS-1$
Integer.parseInt(ServerConfiguration.XML_RPC_PORT_DEFAULT),
KeyStoreManager.DEFAULT_CERTIFICATE);
return new ServerMock(createServer, emfStore, serverSpace);
}
public static void deleteUser(SessionId sessionId, ACOrgUnitId user) throws ESException {
ESWorkspaceProviderImpl.getInstance().getAdminConnectionManager().deleteUser(sessionId, user);
}
/**
* Convenience method for deleting a group by name instead of its ID.
*
* @param session
* the {@link ESUsersession} that is used to connection to the admin connection manager
* @param groupName
* the name of the group to be deleted. Case is ignored
*
* @return {@code true}, if the groups has been deleted successfully, {@code false} otherwise
*
* @throws ESException
* in case the delete fails
*/
public static boolean deleteGroup(ESUsersession session, String groupName) throws ESException {
final ESSessionIdImpl sessionId = ESSessionIdImpl.class.cast(session.getSessionId());
final List<ACGroup> groups = ESWorkspaceProviderImpl
.getInstance()
.getAdminConnectionManager()
.getGroups(sessionId.toInternalAPI());
ACOrgUnitId id = null;
for (final ACGroup acGroup : groups) {
if (acGroup.getName().equalsIgnoreCase(groupName)) {
id = acGroup.getId();
break;
}
}
if (id != null) {
ESWorkspaceProviderImpl
.getInstance()
.getAdminConnectionManager()
.deleteGroup(sessionId.toInternalAPI(), id);
return true;
}
return false;
}
public static ACOrgUnitId createUser(ESUsersession session, String name) throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
return broker.createUser(name);
}
public static ACOrgUnitId createGroup(ESUsersession session, String name) throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
return broker.createGroup(name);
}
// TODO: user parameter is not needed
public static void changePassword(ESUsersession session, ACOrgUnitId userId, String user, String password)
throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
broker.changeUser(userId, user, password);
}
public static void changeUser(ESUsersession session, ACOrgUnitId userId, String userName, String password)
throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
broker.changeUser(userId, userName, password);
}
public static ACUser getUser(ESUsersession session, String name) throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
for (final ACUser acUser : broker.getUsers()) {
if (acUser.getName().equals(name)) {
return acUser;
}
}
return null;
}
public static ACGroup getGroup(ESUsersession session, String name) throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
for (final ACGroup group : broker.getGroups()) {
if (group.getName().equals(name)) {
return group;
}
}
return null;
}
public static ACUser getUser(ESUsersession session, ACOrgUnitId userId) throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
for (final ACUser acUser : broker.getUsers()) {
if (acUser.getId().getId().equals(userId.getId())) {
return acUser;
}
}
return null;
}
/**
* @param sessionImpl
* @return
* @throws ConnectionException
*/
private static AdminBrokerImpl createAdminBroker(final ESUsersessionImpl sessionImpl) throws ConnectionException {
return new AdminBrokerImpl(sessionImpl.toInternalAPI().getServerInfo(),
sessionImpl.toInternalAPI().getSessionId());
}
public static ACUser getParticipant(ESUsersession session, ProjectId projectId, ACOrgUnitId userId)
throws ESException {
final ESUsersessionImpl sessionImpl = ESUsersessionImpl.class.cast(session);
final AdminBrokerImpl broker = createAdminBroker(sessionImpl);
for (final ACOrgUnit acUser : broker.getParticipants(projectId)) {
if (acUser.getId().getId().equals(userId.getId()) && acUser instanceof ACUser) {
return (ACUser) acUser;
}
}
return null;
}
private static void setSuperUser(ACDAOFacade daoFacade) throws FatalESException {
final String superuser = ServerConfiguration.getProperties().getProperty(ServerConfiguration.SUPER_USER,
ServerConfiguration.SUPER_USER_DEFAULT);
for (final ACUser user : daoFacade.getUsers()) {
if (user.getName().equals(superuser)) {
return;
}
}
final ACUser superUser = AccesscontrolFactory.eINSTANCE.createACUser();
superUser.setName(superuser);
superUser.setFirstName(SUPER);
superUser.setLastName("user"); //$NON-NLS-1$
superUser.setDescription(Messages.ServerUtil_ServerAdmin_Description);
superUser.getRoles().add(RolesFactory.eINSTANCE.createServerAdmin());
daoFacade.add(superUser);
ModelUtil.logInfo(Messages.ServerUtil_Added_Superuser + superuser);
}
public static Properties initProperties(Map<String, String> additionalProperties) {
final File propertyFile = new File(ServerConfiguration.getConfFile());
final Properties properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(propertyFile);
properties.load(fis);
ServerConfiguration.setProperties(properties, false);
ModelUtil.logInfo("Property file read. (" + propertyFile.getAbsolutePath() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
for (final Map.Entry<String, String> entry : additionalProperties.entrySet()) {
if (StringUtils.isNotEmpty(entry.getValue())) {
properties.setProperty(entry.getKey(), entry.getValue());
}
}
} catch (final IOException e) {
ModelUtil.logWarning(Messages.ServerUtil_Property_Init_Failed, e);
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (final IOException e) {
ModelUtil.logWarning(Messages.ServerUtil_Could_Not_Close_File, e);
}
}
return properties;
}
private static void copyFileToWorkspace(String target, String source, String failure, String success) {
final File targetFile = new File(target);
if (!targetFile.exists()) {
// check if the custom configuration resources are provided and if,
// copy them to place
final ESExtensionPoint extensionPoint = new ESExtensionPoint(
"org.eclipse.emf.emfstore.server.configurationResource"); //$NON-NLS-1$
final ESExtensionElement element = extensionPoint.getFirst();
if (element != null) {
final String attribute = element.getAttribute(targetFile.getName());
if (attribute != null) {
try {
FileUtil.copyFile(new URL("platform:/plugin/" //$NON-NLS-1$
+ element.getIConfigurationElement().getNamespaceIdentifier() + "/" + attribute) //$NON-NLS-1$
.openConnection().getInputStream(), targetFile);
return;
} catch (final IOException e) {
ModelUtil.logWarning("Copy of file from " + source + " to " + target + " failed", e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
}
// Guess not, lets copy the default configuration resources
try {
FileUtil.copyFile(getResource("testFiles/" + source), targetFile); //$NON-NLS-1$
} catch (final IOException e) {
ModelUtil.logWarning("Copy of file from " + source + " to " + target + " failed", e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
}
// TODO: duplicate method
private static InputStream getResource(String resource) throws IOException {
final URL configURL =
FrameworkUtil.getBundle(ServerUtil.class).getEntry(resource);
// Activator.getDefault().getBundle().getBundleContext().getBundle()
// .getEntry(resource);
if (configURL != null) {
final InputStream input = configURL.openStream();
return input;
}
return null;
}
private static ServerSpace initServerSpace() {
final ResourceSetImpl set = new ResourceSetImpl();
set.setResourceFactoryRegistry(new ResourceFactoryMock());
final Resource resource = set.createResource(URI.createURI(StringUtils.EMPTY));
final ServerSpace serverSpace = ModelFactory.eINSTANCE.createServerSpace();
resource.getContents().add(serverSpace);
return serverSpace;
}
private static ServerSpace initServerSpace(ACDAOFacade daoFacade) {
final ResourceSetImpl set = new ResourceSetImpl();
set.setResourceFactoryRegistry(new ResourceFactoryMock());
final Resource resource = set.createResource(URI.createURI(StringUtils.EMPTY));
final ServerSpace serverSpace = new MockServerSpace(daoFacade); // ModelFactory.eINSTANCE.createServerSpace();
resource.getContents().add(serverSpace);
return serverSpace;
}
}