blob: e6623e91253da27fe2fc343d8486979d525d4be8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 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:
* Johannes Faltermeier - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.ui.transaction;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.emfstore.common.ESRunnableWrapper;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
/**
* Implementation of {@link ESRunnableWrapper} for creating
* {@link TransactionalEditingDomain#createPrivilegedRunnable(Runnable) privileged runnables} to be executed on the UI
* thread.
*
* @author jfaltermeier
*
*/
public class PrivilegedRunnableProvider implements ESRunnableWrapper {
/**
*
* {@inheritDoc}
*
* @see org.eclipse.emf.emfstore.common.ESRunnableWrapper#createRunnable(java.lang.Runnable)
*/
public Runnable createRunnable(Runnable runnable) {
final EditingDomain editingDomain = ESWorkspaceProviderImpl.getInstance().getEditingDomain();
if (!TransactionalEditingDomain.class.isInstance(editingDomain)) {
throw new IllegalStateException(
"The PrivilegedRunnableProvider may only be used in conjunction with a Transactional Editing Domain"); //$NON-NLS-1$
}
final TransactionalEditingDomain transactionalEditingDomain = TransactionalEditingDomain.class
.cast(editingDomain);
try {
final RunnableWithResult<?> privilegedRunnable = transactionalEditingDomain
.createPrivilegedRunnable(runnable);
return privilegedRunnable;
} catch (final IllegalStateException ex) {
/*
* createPrivilegedRunnable will fail if
* - there is no active transaction
* - the current thread is different than the thread of the transaction owner
* in this case we have no other option than to return the original runnable
*/
return runnable;
}
}
}